11import 'dart:convert' ;
22import 'dart:ui' ;
33
4- import 'package:arabic_learning/vars/config_structure.dart' show ClassItem, SourceItem, WordItem;
4+ import 'package:arabic_learning/vars/config_structure.dart' show ClassItem, SourceItem, WordItem, ClassSelection ;
55import 'package:flutter/material.dart' ;
66import 'package:provider/provider.dart' ;
77
@@ -36,7 +36,7 @@ import 'package:arabic_learning/funcs/utili.dart';
3636/// List<List<String>> value = await popSelectClasses(context);
3737/// List<Map<String, dynamic>> words = getSelectedWords(context , forceSelectClasses: value);
3838/// ```
39- Future <List < ClassItem >> popSelectClasses (BuildContext context, {bool withCache = false }) async {
39+ Future <ClassSelection > popSelectClasses (BuildContext context, {bool withCache = false , bool withReviewChoose = true }) async {
4040 context.read <Global >().uiLogger.info ("弹出课程选择(ClassSelectPage),withCache: $withCache " );
4141 final List <ClassItem > beforeSelectedClasses = [];
4242 if (withCache) {
@@ -59,15 +59,14 @@ Future<List<ClassItem>> popSelectClasses(BuildContext context, {bool withCache =
5959 }
6060 context.read <Global >().uiLogger.fine ("已缓存课程选择: $beforeSelectedClasses " );
6161 }
62- List < ClassItem > ? selectedClasses = await showModalBottomSheet <List < ClassItem > >(
62+ ClassSelection ? selectedClasses = await showModalBottomSheet <ClassSelection >(
6363 context: context,
64- // 假装圆角... :)
6564 shape: RoundedRectangleBorder (side: BorderSide (width: 1.0 , color: Theme .of (context).colorScheme.onSurface.withAlpha (150 )), borderRadius: StaticsVar .br),
6665 isDismissible: false ,
6766 isScrollControlled: context.read <Global >().isWideScreen,
6867 enableDrag: true ,
6968 builder: (BuildContext context) {
70- return ClassSelectPage (beforeSelectedClasses: beforeSelectedClasses);
69+ return ClassSelectPage (beforeSelectedClasses: beforeSelectedClasses, withReviewChoose : withReviewChoose );
7170 }
7271 );
7372 if (withCache && selectedClasses != null && context.mounted) {
@@ -78,7 +77,7 @@ Future<List<ClassItem>> popSelectClasses(BuildContext context, {bool withCache =
7877 context.read <Global >().uiLogger.info ("课程选择缓存完成" );
7978 }
8079 if (context.mounted) context.read <Global >().uiLogger.fine ("选择的课程: $selectedClasses " );
81- return selectedClasses?? [] ;
80+ return selectedClasses?? ClassSelection (selectedClass : [], countInReview : false ) ;
8281}
8382
8483
@@ -573,19 +572,23 @@ class WordCard extends StatelessWidget {
573572/// 注意:如果你要进行课程选择,请先考虑 [popSelectClasses] 函数,这是一个已经基本成熟的实现
574573class ClassSelectPage extends StatelessWidget {
575574 final List <ClassItem > beforeSelectedClasses;
576- const ClassSelectPage ({super .key, this .beforeSelectedClasses = const []});
575+ final bool withReviewChoose;
576+ const ClassSelectPage ({super .key, this .beforeSelectedClasses = const [], this .withReviewChoose = false });
577577 @override
578578 Widget build (BuildContext context) {
579579 final MediaQueryData mediaQuery = MediaQuery .of (context);
580- List <ClassItem > selectedClass = beforeSelectedClasses.toList ();
580+ ClassSelection classSelection = ClassSelection (
581+ selectedClass: beforeSelectedClasses.toList (),
582+ countInReview: context.read <Global >().globalFSRS.config.enabled
583+ );
581584 void addClass (ClassItem classInfo) {
582- selectedClass.add (classInfo);
585+ classSelection. selectedClass.add (classInfo);
583586 }
584587 void removeClass (ClassItem classInfo) {
585- selectedClass.remove (classInfo);
588+ classSelection. selectedClass.remove (classInfo);
586589 }
587590 bool isClassSelected (ClassItem classInfo) {
588- return selectedClass.any ((e) => e== classInfo);
591+ return classSelection. selectedClass.any ((e) => e== classInfo);
589592 }
590593 void onClassChanged (ClassItem classInfo) {
591594 if (isClassSelected (classInfo)) {
@@ -594,14 +597,6 @@ class ClassSelectPage extends StatelessWidget {
594597 addClass (classInfo);
595598 }
596599 }
597- // 和监听器脱钩...
598- // if(!context.watch<ClassSelectModel>().initialized) {
599- // return Scaffold(
600- // body: Center(
601- // child: CircularProgressIndicator(),
602- // ),
603- // );
604- // }
605600
606601 return Scaffold (
607602 appBar: AppBar (
@@ -614,14 +609,35 @@ class ClassSelectPage extends StatelessWidget {
614609 children: classesSelectionList (context, onClassChanged, isClassSelected)
615610 ),
616611 ),
612+ if (withReviewChoose) StatefulBuilder (
613+ builder: (context, setLocalState) {
614+ return Row (
615+ children: [
616+ Expanded (child: Text ("本次学习${classSelection .countInReview ?"将" :"不会" }计入复习系统" )),
617+ Switch (
618+ value: classSelection.countInReview,
619+ onChanged: (value){
620+ if (value == true && ! context.read <Global >().globalFSRS.config.enabled) {
621+ ScaffoldMessenger .of (context).showSnackBar (SnackBar (content: Text ("请先启用复习系统" )));
622+ return ;
623+ }
624+ setLocalState (() {
625+ classSelection.countInReview = value;
626+ });
627+ }
628+ )
629+ ],
630+ );
631+ }
632+ ),
617633 ElevatedButton (
618634 style: ElevatedButton .styleFrom (
619635 fixedSize: Size (mediaQuery.size.width, mediaQuery.size.height * 0.08 ),
620636 shape: ContinuousRectangleBorder (borderRadius: StaticsVar .br),
621637 ),
622638 child: Text ('确认' ),
623639 onPressed: () {
624- Navigator .pop (context, selectedClass );
640+ Navigator .pop (context, classSelection );
625641 },
626642 ),
627643 ],
@@ -700,6 +716,7 @@ class ChoiceQuestions extends StatefulWidget {
700716 final List <String > choices;
701717 final bool ? Function (int ) onSelected;
702718 final String ? hint;
719+ final Widget ? midWidget;
703720 final Widget ? bottomWidget;
704721 final Function ? onDisAllowMutipleSelect;
705722 final bool allowMutipleSelect;
@@ -712,6 +729,7 @@ class ChoiceQuestions extends StatefulWidget {
712729 required this .allowAudio,
713730 required this .onSelected,
714731 this .hint,
732+ this .midWidget,
715733 this .bottomWidget,
716734 this .onDisAllowMutipleSelect,
717735 this .bottonLayout = - 1 ,
@@ -742,7 +760,7 @@ class _ChoiceQuestions extends State<ChoiceQuestions> {
742760 children: [
743761 if (widget.hint!= null ) TextContainer (text: widget.hint! , animated: true ),
744762 Expanded (
745- child: StatefulBuilder (
763+ child: widget.midWidget ?? StatefulBuilder (
746764 builder: (context, setLocalState) {
747765 return ElevatedButton .icon (
748766 icon: Icon (widget.allowAudio ? (playing ? Icons .multitrack_audio : Icons .volume_up) : Icons .short_text, size: 24.0 ),
0 commit comments