86 lines
2.5 KiB
Dart
86 lines
2.5 KiB
Dart
import 'package:flutter/material.dart';
|
|
import '../models/custom_kanji_item.dart';
|
|
import '../services/custom_deck_repository.dart';
|
|
import 'add_card_screen.dart';
|
|
import 'custom_quiz_screen.dart';
|
|
|
|
class CustomSrsScreen extends StatefulWidget {
|
|
const CustomSrsScreen({super.key});
|
|
|
|
@override
|
|
State<CustomSrsScreen> createState() => _CustomSrsScreenState();
|
|
}
|
|
|
|
class _CustomSrsScreenState extends State<CustomSrsScreen> with SingleTickerProviderStateMixin {
|
|
late TabController _tabController;
|
|
final _deckRepository = CustomDeckRepository();
|
|
List<CustomKanjiItem> _deck = [];
|
|
final _quizScreenKeys = [
|
|
GlobalKey<CustomQuizScreenState>(),
|
|
GlobalKey<CustomQuizScreenState>(),
|
|
GlobalKey<CustomQuizScreenState>(),
|
|
];
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
_tabController = TabController(length: 3, vsync: this);
|
|
_tabController.addListener(() {
|
|
if (_tabController.indexIsChanging) {
|
|
final key = _quizScreenKeys[_tabController.index];
|
|
key.currentState?.playAudio();
|
|
}
|
|
});
|
|
_loadDeck();
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
_tabController.dispose();
|
|
super.dispose();
|
|
}
|
|
|
|
Future<void> _loadDeck() async {
|
|
final deck = await _deckRepository.getCustomDeck();
|
|
setState(() {
|
|
_deck = deck;
|
|
});
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Scaffold(
|
|
appBar: AppBar(
|
|
title: const Text('Custom SRS'),
|
|
bottom: TabBar(
|
|
controller: _tabController,
|
|
tabs: const [
|
|
Tab(text: 'Jpn→Eng'),
|
|
Tab(text: 'Eng→Jpn'),
|
|
Tab(text: 'Listening'),
|
|
],
|
|
),
|
|
),
|
|
body: _deck.isEmpty
|
|
? const Center(child: CircularProgressIndicator())
|
|
: TabBarView(
|
|
controller: _tabController,
|
|
children: [
|
|
CustomQuizScreen(key: _quizScreenKeys[0], deck: _deck, quizMode: CustomQuizMode.japaneseToEnglish),
|
|
CustomQuizScreen(key: _quizScreenKeys[1], deck: _deck, quizMode: CustomQuizMode.englishToJapanese),
|
|
CustomQuizScreen(key: _quizScreenKeys[2], deck: _deck, quizMode: CustomQuizMode.listeningComprehension),
|
|
],
|
|
),
|
|
floatingActionButton: FloatingActionButton(
|
|
onPressed: () async {
|
|
await Navigator.of(context).push(
|
|
MaterialPageRoute(builder: (_) => const AddCardScreen()),
|
|
);
|
|
_loadDeck();
|
|
},
|
|
child: const Icon(Icons.add),
|
|
),
|
|
);
|
|
}
|
|
}
|