85 lines
2.3 KiB
Dart
85 lines
2.3 KiB
Dart
import 'dart:async';
|
|
import 'dart:math';
|
|
|
|
import 'package:auto_route/auto_route.dart';
|
|
import 'package:flutter/cupertino.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter/widgets.dart';
|
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
|
import 'package:mnemo_cards/features/tests/progress_widget.dart';
|
|
import 'package:rxdart/rxdart.dart';
|
|
|
|
import '../../di/locator.dart';
|
|
import '../../theme/themes.dart';
|
|
|
|
class TestProgressWidget extends StatefulWidget {
|
|
@override
|
|
State<StatefulWidget> createState() => _TestProgressWidgetState();
|
|
|
|
const TestProgressWidget({super.key});
|
|
}
|
|
|
|
class _TestProgressWidgetState extends State<TestProgressWidget> {
|
|
List<Result> results = [];
|
|
int length = 0;
|
|
|
|
Stream<Duration>? timer;
|
|
|
|
Timer? _updateTimer;
|
|
|
|
void _updateDataListener() {
|
|
if (_updateTimer == null || !_updateTimer!.isActive) {
|
|
_updateTimer = Timer(Duration(milliseconds: 100), _updateData);
|
|
}
|
|
}
|
|
|
|
void _updateData() {
|
|
results = <Result>[
|
|
Result.correct,
|
|
];
|
|
length = locator.testManager.questions.length + 1;
|
|
final pageController = locator.testManager.pageController;
|
|
for (final state in locator.testManager.states) {
|
|
if (state.isAnswered) {
|
|
if (state.isCorrect) {
|
|
results.add(Result.correct);
|
|
} else {
|
|
// results.add(Result.wrong);
|
|
results.add(Result.wrong);
|
|
}
|
|
} else if (state.isSkipped) {
|
|
results.add(Result.skiped);
|
|
} else {
|
|
results.add(Result.not_visited);
|
|
}
|
|
}
|
|
if (mounted) {
|
|
setState(() {});
|
|
}
|
|
}
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
// locator.testManager.removeListener(_updateData);
|
|
// locator.testManager.addListener(_updateData);
|
|
locator.testManager.pageController.removeListener(_updateDataListener);
|
|
locator.testManager.pageController.addListener(_updateDataListener);
|
|
timer = Stream.periodic(
|
|
Duration(seconds: 1),
|
|
(tick) => Duration(seconds: 300 - tick - 1),
|
|
).startWith(Duration(seconds: 300)).take(300);
|
|
_updateData();
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return ProgressWidget(
|
|
results,
|
|
length,
|
|
locator.testManager.color,
|
|
timer: timer,
|
|
key: ValueKey('TEST PROGRESS'),
|
|
);
|
|
}
|
|
}
|