134 lines
4.9 KiB
Dart
134 lines
4.9 KiB
Dart
import 'dart:math';
|
|
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
|
import 'package:mnemo_cards/features/tests/test_manager.dart';
|
|
import 'package:mnemo_cards/features/tests/test_widgets/common_test_question_widget.dart';
|
|
import 'package:mnemo_cards/features/tests/test_widgets/test_image.dart';
|
|
import 'package:mnemo_cards_common/mnemo_cards_common.dart';
|
|
|
|
import '../../../di/locator.dart';
|
|
import '../question_states/simple_test_state.dart';
|
|
import 'test_button.dart';
|
|
|
|
class SimpleTestWidget extends StatelessWidget {
|
|
final SimpleTestQuestionBody _simpleTestModel;
|
|
|
|
SimpleTestQuestionBody get model => _simpleTestModel;
|
|
|
|
bool get isCorrect => state.answer.startsWith(model.answer);
|
|
|
|
SimpleTestState get state => manager.getState(model.id!) as SimpleTestState;
|
|
|
|
TestManager get manager => locator.testManager;
|
|
|
|
Color get testColor => manager.color;
|
|
|
|
const SimpleTestWidget(this._simpleTestModel, {super.key});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final random = Random(state.seed);
|
|
final buttons = [...model.buttons]..shuffle(random);
|
|
|
|
return LayoutBuilder(builder: (context, constraints) {
|
|
return Padding(
|
|
padding: const EdgeInsets.all(8.0),
|
|
child: Column(
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
Expanded(
|
|
child: CommonTestQuestionWidget(
|
|
text: model.text,
|
|
image: model.image,
|
|
audio: model.audio,
|
|
),
|
|
),
|
|
SizedBox(
|
|
height: 16.0,
|
|
),
|
|
StatefulBuilder(builder: (context, setState) {
|
|
void setAnswer(String answer) {
|
|
setState(() {
|
|
manager.setState(
|
|
model.id!,
|
|
state.copyWith(
|
|
answer: answer,
|
|
),
|
|
);
|
|
// only setting isCorrect once
|
|
manager.setState(
|
|
model.id!,
|
|
state.copyWith(
|
|
isAnswered: true,
|
|
isCorrect: state.isAnswered ? state.isCorrect : isCorrect,
|
|
),
|
|
);
|
|
});
|
|
if (isCorrect) {
|
|
Future.delayed(
|
|
Duration(milliseconds: 300),
|
|
manager.nextTest,
|
|
);
|
|
}
|
|
}
|
|
|
|
bool buttonLine = (model.image != null &&
|
|
buttons.where((element) => element.image != null).length !=
|
|
2);
|
|
final imageSide = buttonLine
|
|
? constraints.maxWidth / 4 - 8
|
|
: constraints.maxWidth / 2 - 16;
|
|
final spacing = buttonLine ? 4.0 : 8.0;
|
|
|
|
return AbsorbPointer(
|
|
absorbing: state.isCorrect,
|
|
child: Wrap(
|
|
spacing: spacing,
|
|
runSpacing: 8.0,
|
|
children: buttons
|
|
.map(
|
|
(e) => e.isTextButton
|
|
? Container(
|
|
width: constraints.maxWidth / 2 - 16,
|
|
height: 90.h,
|
|
child: TestButton(
|
|
text: e.text,
|
|
onTap: () {
|
|
setAnswer(e.id);
|
|
},
|
|
// borderColor: testColor,
|
|
color: state.answer == e.id
|
|
? isCorrect
|
|
? Colors.green.withOpacity(0.5)
|
|
: Colors.red.withOpacity(0.5)
|
|
: Theme.of(context).scaffoldBackgroundColor,
|
|
),
|
|
)
|
|
: SizedBox(
|
|
width: imageSide,
|
|
height: imageSide,
|
|
child: TestButton(
|
|
image: TestImage.image(e.image!),
|
|
onTap: () {
|
|
setAnswer(e.id);
|
|
},
|
|
// borderColor: testColor,
|
|
color: e.id == state.answer
|
|
? isCorrect
|
|
? Colors.green.withOpacity(0.5)
|
|
: Colors.red.withOpacity(0.5)
|
|
: Theme.of(context).scaffoldBackgroundColor,
|
|
),
|
|
),
|
|
)
|
|
.toList(),
|
|
),
|
|
);
|
|
})
|
|
],
|
|
),
|
|
);
|
|
});
|
|
}
|
|
}
|