some cleanup and some fixes

This commit is contained in:
Rene Kievits
2025-11-01 06:38:14 +01:00
parent 732408997d
commit d5ff5eb12f
9 changed files with 148 additions and 84 deletions

View File

@@ -1,9 +1,10 @@
import 'package:flutter/material.dart';
import 'dart:math';
import 'package:flutter_tts/flutter_tts.dart';
import '../models/custom_kanji_item.dart';
import '../widgets/options_grid.dart';
import '../widgets/kanji_card.dart';
import 'package:provider/provider.dart';
import '../services/tts_service.dart';
enum CustomQuizMode {
japaneseToEnglish,
@@ -38,7 +39,6 @@ class CustomQuizScreenState extends State<CustomQuizScreen>
List<String> _options = [];
bool _answered = false;
bool? _correct;
late FlutterTts _flutterTts;
late AnimationController _shakeController;
late Animation<double> _shakeAnimation;
final List<String> _incorrectlyAnsweredItems = [];
@@ -47,7 +47,6 @@ class CustomQuizScreenState extends State<CustomQuizScreen>
void initState() {
super.initState();
_shuffledDeck = widget.deck.toList()..shuffle();
_initTts();
if (_shuffledDeck.isNotEmpty) {
_generateOptions();
}
@@ -61,6 +60,11 @@ class CustomQuizScreenState extends State<CustomQuizScreen>
);
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
}
@override
void didUpdateWidget(CustomQuizScreen oldWidget) {
super.didUpdateWidget(oldWidget);
@@ -82,21 +86,18 @@ class CustomQuizScreenState extends State<CustomQuizScreen>
}
}
void playAudio() {
void playAudio() async {
if (widget.quizMode == CustomQuizMode.listeningComprehension &&
_currentIndex < _shuffledDeck.length) {
_speak(_shuffledDeck[_currentIndex].characters);
final ttsService = Provider.of<TtsService>(context, listen: false);
await ttsService.speak(_shuffledDeck[_currentIndex].characters);
}
}
void _initTts() async {
_flutterTts = FlutterTts();
await _flutterTts.setLanguage("ja-JP");
}
@override
void dispose() {
_flutterTts.stop();
_shakeController.dispose();
super.dispose();
}
@@ -106,7 +107,8 @@ class CustomQuizScreenState extends State<CustomQuizScreen>
if (widget.quizMode == CustomQuizMode.listeningComprehension ||
widget.quizMode == CustomQuizMode.japaneseToEnglish) {
_options = [currentItem.meaning];
} else {
}
else {
_options = [
widget.useKanji && currentItem.kanji != null
? currentItem.kanji!
@@ -232,7 +234,8 @@ class CustomQuizScreenState extends State<CustomQuizScreen>
}
if (isCorrect) {
if (widget.quizMode == CustomQuizMode.japaneseToEnglish) {
if (widget.quizMode == CustomQuizMode.japaneseToEnglish ||
widget.quizMode == CustomQuizMode.englishToJapanese) {
await _speak(currentItem.characters);
}
await Future.delayed(const Duration(milliseconds: 500));
@@ -244,22 +247,24 @@ class CustomQuizScreenState extends State<CustomQuizScreen>
_nextQuestion();
}
void _nextQuestion() {
Future<void> _nextQuestion() async {
setState(() {
_currentIndex++;
_answered = false;
_correct = null;
if (_currentIndex < _shuffledDeck.length) {
_generateOptions();
if (widget.quizMode == CustomQuizMode.listeningComprehension) {
_speak(_shuffledDeck[_currentIndex].characters);
}
}
});
if (_currentIndex < _shuffledDeck.length &&
widget.quizMode == CustomQuizMode.listeningComprehension) {
await _speak(_shuffledDeck[_currentIndex].characters);
}
}
Future<void> _speak(String text) async {
await _flutterTts.speak(text);
final ttsService = Provider.of<TtsService>(context, listen: false);
await ttsService.speak(text);
}
void _onOptionSelected(String option) {
@@ -287,6 +292,12 @@ class CustomQuizScreenState extends State<CustomQuizScreen>
icon: const Icon(Icons.volume_up, size: 64),
onPressed: () => _speak(currentItem.characters),
);
} else if (widget.quizMode == CustomQuizMode.englishToJapanese) {
promptWidget = Text(
question,
style: TextStyle(fontSize: 48, color: Theme.of(context).colorScheme.onSurface),
textAlign: TextAlign.center,
);
} else {
promptWidget = GestureDetector(
onTap: () => _speak(question),