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
@@ -175,42 +175,42 @@ class _LearningShellState extends State<LearningShell> {
return Scaffold(
body: body,
bottomNavigationBar: route == _ShellRoute.tab
? NavigationBar(
selectedIndex: tab.index,
height: 70,
indicatorColor: AppColors.softGreen,
onDestinationSelected: (index) =>
showTab(AppTab.values[index]),
destinations: const [
NavigationDestination(
icon: Icon(Icons.menu_book_outlined),
selectedIcon: Icon(Icons.menu_book),
label: "学习",
),
NavigationDestination(
icon: Icon(Icons.chat_bubble_outline),
selectedIcon: Icon(Icons.chat_bubble),
label: "对话",
),
NavigationDestination(
icon: Icon(Icons.refresh_outlined),
selectedIcon: Icon(Icons.refresh),
label: "复习",
),
NavigationDestination(
icon: Icon(Icons.abc_outlined),
selectedIcon: Icon(Icons.abc),
label: "单词",
),
NavigationDestination(
icon: Icon(Icons.person_outline),
selectedIcon: Icon(Icons.person),
label: "我的",
),
],
)
: null,
bottomNavigationBar: route == _ShellRoute.tab
? NavigationBar(
selectedIndex: tab.index,
height: 70,
indicatorColor: AppColors.softGreen,
onDestinationSelected: (index) =>
showTab(AppTab.values[index]),
destinations: const [
NavigationDestination(
icon: Icon(Icons.menu_book_outlined),
selectedIcon: Icon(Icons.menu_book),
label: "学习",
),
NavigationDestination(
icon: Icon(Icons.chat_bubble_outline),
selectedIcon: Icon(Icons.chat_bubble),
label: "对话",
),
NavigationDestination(
icon: Icon(Icons.refresh_outlined),
selectedIcon: Icon(Icons.refresh),
label: "复习",
),
NavigationDestination(
icon: Icon(Icons.abc_outlined),
selectedIcon: Icon(Icons.abc),
label: "单词",
),
NavigationDestination(
icon: Icon(Icons.person_outline),
selectedIcon: Icon(Icons.person),
label: "我的",
),
],
)
: null,
);
},
),
@@ -223,8 +223,9 @@ class _LearningShellState extends State<LearningShell> {
return HomePage(
state: widget.state,
onStartLesson: () {
if (widget.state.completedLessonIds
.contains(widget.state.activeLessonId)) {
if (widget.state.completedLessonIds.contains(
widget.state.activeLessonId,
)) {
final next = widget.state.nextIncompleteLessonId;
if (next != null) widget.state.openLesson(next);
}