feat: 完善听力口语辅助状态记录、练习分块与复习抽查间隔机制

This commit is contained in:
shen
2026-09-23 18:33:22 -07:00
parent 6b42b7abc3
commit d740a9e19c
106 changed files with 2933 additions and 845 deletions
+23 -4
View File
@@ -53,12 +53,19 @@ abstract class _AppStateData extends ChangeNotifier {
LessonStep lessonStep = LessonStep.preview;
int previewIndex = 0;
bool lessonListeningComplete = false;
bool listeningAudioPlayed = false;
bool listeningAudioUnavailable = false;
ListeningSupport listeningSupport = ListeningSupport.none;
int listeningAttempts = 0;
bool sentenceBuildUsed = false;
int sentenceBuildIndex = 0;
bool lessonSpeakingComplete = false;
bool lessonReadingComplete = false;
bool lessonWritingComplete = false;
bool lessonDialogueComplete = false;
bool independentAttemptComplete = false;
bool independentAttemptAssisted = false;
bool independentAttemptPending = false;
bool independentAttemptSpoken = false;
String lessonWritingDraft = '';
String independentAttemptDraft = '';
@@ -101,7 +108,8 @@ abstract class _AppStateData extends ChangeNotifier {
}
class AppState extends _AppStateData
with _ReviewAndMastery,
with
_ReviewAndMastery,
_ReceptiveWords,
_AssessmentProgress,
_LessonProgress,
@@ -245,10 +253,14 @@ class AppState extends _AppStateData
notifyListeners();
}
/// Applies the placement result. The start may land on any loaded lesson
/// across A0–B1, and placement never counts as passing a lesson.
/// Placement never marks an earlier lesson as passed or opens draft content.
void setPlacementStartLesson(String lessonId) {
if (!allLessons.any((lesson) => lesson.id == lessonId)) return;
if (!allLessons.any(
(lesson) =>
lesson.id == lessonId && lesson.status == ContentStatus.approved,
)) {
return;
}
placementStartLessonId = lessonId;
activeLessonId = lessonId;
_resetLessonFlow();
@@ -312,12 +324,19 @@ class AppState extends _AppStateData
lessonStep = LessonStep.preview;
previewIndex = 0;
lessonListeningComplete = false;
listeningAudioPlayed = false;
listeningAudioUnavailable = false;
listeningSupport = ListeningSupport.none;
listeningAttempts = 0;
sentenceBuildUsed = false;
sentenceBuildIndex = 0;
lessonSpeakingComplete = false;
lessonReadingComplete = false;
lessonWritingComplete = false;
lessonDialogueComplete = false;
independentAttemptComplete = false;
independentAttemptAssisted = false;
independentAttemptPending = false;
independentAttemptSpoken = false;
mastery.clear();
notifyListeners();