feat: A1 短材料复现本单元理解词,并加入黑夜模式

课程内容
- 重写全部 21 个 A1 单元的听读材料,把本单元理解词织进听/读文本,
  单元内理解词复现率从约 20% 提升到约 77%(各单元 56–96%)。
- 修正 U01 房间号与机场大巴同为 thirty 的撞车(改为 17/30/40)。
- 校验器容差按级别读取(A1 为 8%),materials 覆盖率、字数、
  选项子串等校验全部通过;course_content_test 通过。

黑夜模式
- app_theme 拆分明/暗两套调色板,AppColors 随亮度切换;
  main 用 theme/darkTheme/themeMode + builder 镜像已解析亮度;
  主题偏好持久化到快照;进度页新增“外观主题”切换。

文档
- COURSE-PACK-JSON.md 更新 A1 词池覆盖(840/933)与材料复现约定。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
shenlei
2026-09-18 11:16:09 +09:00
co-authored by Claude Opus 4.8
parent 9ab08c25ef
commit febfd30f49
93 changed files with 72676 additions and 274 deletions
+94 -27
View File
@@ -281,6 +281,14 @@ const a0SeedLessons = [
example: 'Nice to meet you, too.',
exampleMeaning: '我也很高兴认识你。',
),
VocabularyItem(
id: 'a0-01-thanks',
word: 'thanks',
meaning: '谢谢',
example: 'Thanks. Nice to meet you, too.',
exampleMeaning: '谢谢。我也很高兴认识你。',
ipa: '/θæŋks/',
),
],
),
SeedLesson(
@@ -405,6 +413,14 @@ const a0SeedLessons = [
example: 'What’s this? It’s a key.',
exampleMeaning: '这是什么?这是钥匙。',
),
VocabularyItem(
id: 'a0-05-bag',
word: 'bag',
meaning: '包',
example: 'It’s a bag.',
exampleMeaning: '这是一个包。',
ipa: '/bæɡ/',
),
],
),
SeedLesson(
@@ -451,6 +467,22 @@ const a0SeedLessons = [
example: 'This is my mother.',
exampleMeaning: '这是我的妈妈。',
),
VocabularyItem(
id: 'a0-07-sister',
word: 'sister',
meaning: '姐妹',
example: 'This is my sister.',
exampleMeaning: '这是我的姐姐(或妹妹)。',
ipa: '/ˈsɪstə(r)/',
),
VocabularyItem(
id: 'a0-07-brother',
word: 'brother',
meaning: '兄弟',
example: 'This is my brother.',
exampleMeaning: '这是我的哥哥(或弟弟)。',
ipa: '/ˈbrʌðə(r)/',
),
],
),
SeedLesson(
@@ -496,14 +528,38 @@ const a0SeedLessons = [
example: 'Do you like tea?',
exampleMeaning: '你喜欢茶吗?',
),
VocabularyItem(
id: 'a0-09-music',
word: 'music',
meaning: '音乐',
example: 'I like music.',
exampleMeaning: '我喜欢音乐。',
ipa: '/ˈmjuːzɪk/',
),
VocabularyItem(
id: 'a0-09-movies',
word: 'movies',
meaning: '电影',
example: 'Do you like movies?',
exampleMeaning: '你喜欢看电影吗?',
ipa: '/ˈmuːviz/',
),
],
),
SeedLesson(
id: 'a0-10',
number: 10,
title: 'A0 综合任务',
outcome: '完成自我介绍、喜好和反问',
outcome: '没听清时请对方重复,并完成自我介绍、喜好和反问',
vocabulary: [
VocabularyItem(
id: 'a0-10-water',
word: 'water',
meaning: '水',
example: 'I like water.',
exampleMeaning: '我喜欢喝水。',
ipa: '/ˈwɔːtər/',
),
VocabularyItem(
id: 'a0-10-again',
word: 'Please say that again.',
@@ -531,6 +587,7 @@ class LessonActivity {
required this.listeningQuestion,
required this.answers,
required this.speaking,
this.speakingTip = '',
required this.reading,
required this.readingQuestion,
required this.readingAnswer,
@@ -544,6 +601,9 @@ class LessonActivity {
final String listeningQuestion;
final List<String> answers;
final String speaking;
/// 这句跟读的发音提示;为空时不显示,避免给每一句套用同一条提示。
final String speakingTip;
final String reading;
final String readingQuestion;
final String readingAnswer;
@@ -587,7 +647,7 @@ const a0Activities = <String, LessonActivity>{
answers: ['自我介绍', '买东西', '问时间'],
speaking: 'Hello. I’m Shen. Nice to meet you.',
reading:
'Mia: Hello. I’m Mia. What’s your name?\nShen: Hi. I’m Shen.\nMia: Nice to meet you.\nShen: Nice to meet you, too.',
'Mia: Hello. I’m Mia. What’s your name?\nShen: Hi. I’m Shen.\nMia: Nice to meet you.\nShen: Thanks. Nice to meet you, too.',
readingQuestion: 'Shen 说的最后一句是什么?',
readingAnswer: 'Nice to meet you, too.',
readingOptions: [
@@ -605,6 +665,7 @@ const a0Activities = <String, LessonActivity>{
listeningQuestion: '这句话是什么意思?',
answers: ['你的名字怎么拼?', '你的名字是什么?', '你来自哪里?'],
speaking: 'S H E N',
speakingTip: '字母之间留一个短停顿:S /es/ - H /eɪtʃ/ - E /iː/ - N /en/。先清楚,不必快。',
reading:
'Mia: I’m Mia. M-I-A.\nShen: Hi, Mia. I’m Shen. S-H-E-N.\nMia: How do you spell Sam?\nShen: S-A-M.',
readingQuestion: 'Shen 自己的名字怎么拼写?',
@@ -635,6 +696,7 @@ const a0Activities = <String, LessonActivity>{
listeningQuestion: '你听到的是哪个号码?',
answers: ['138', '183', '318'],
speaking: 'My number is one-three-eight.',
speakingTip: '号码一个数字一个数字地读,数字之间稍停:one - three - eight。',
reading:
'Mia: What’s your phone number?\nShen: My number is one-three-eight.\nMia: One-eight-three?\nShen: No. One-three-eight.',
readingQuestion: 'Shen 的号码到底是哪一个?',
@@ -650,10 +712,11 @@ const a0Activities = <String, LessonActivity>{
listeningQuestion: '这是什么?',
answers: ['钥匙', '书', '水'],
speaking: 'What’s this? It’s a pen.',
reading: 'Mia: What’s this? Is it a pen?\nShen: No. It’s a book.',
readingQuestion: 'Shen 说那件东西是什么?',
reading:
'Mia: What’s this? Is it a pen?\nShen: No. It’s a book.\nMia: And what’s this?\nShen: It’s a bag.',
readingQuestion: 'Shen 说第一件东西是什么?',
readingAnswer: 'A book',
readingOptions: ['A book', 'A pen', 'A phone'],
readingOptions: ['A book', 'A pen', 'A bag'],
writingPrompt: '写一句“这是一支笔”。',
writingExample: 'It’s a pen.',
independentPrompt: '不看句框,说出一个身边物品。',
@@ -680,10 +743,10 @@ const a0Activities = <String, LessonActivity>{
answers: ['妈妈', '朋友', '老师'],
speaking: 'This is my family.',
reading:
'Mia: Who is this? Is this your father?\nShen: No. This is my mother.',
readingQuestion: 'Shen 介绍的是哪一位家人?',
'Mia: Who is this? Is this your father?\nShen: No. This is my mother.\nMia: And who is this? Your sister?\nShen: No. This is my brother.',
readingQuestion: 'Shen 先介绍的是哪一位家人?',
readingAnswer: 'My mother',
readingOptions: ['My mother', 'My father', 'My sister'],
readingOptions: ['My mother', 'My brother', 'My father'],
writingPrompt: '介绍一位家人或朋友。',
writingExample: 'This is my mother.',
independentPrompt: '不看句框,介绍一位家人或朋友。',
@@ -694,6 +757,7 @@ const a0Activities = <String, LessonActivity>{
listeningQuestion: '是什么时间?',
answers: ['星期一三点', '星期三一点', '星期一一点'],
speaking: 'It’s three o’clock.',
speakingTip: 'o’clock 读作 /əˈklɒk/,前面的 o 很轻。',
reading:
'Mia: What day is it today? Is it Tuesday?\nShen: No. It’s Monday.',
readingQuestion: '对话中今天到底是星期几?',
@@ -710,7 +774,7 @@ const a0Activities = <String, LessonActivity>{
answers: ['喜欢', '不喜欢', '不知道'],
speaking: 'I like tea. Do you like tea?',
reading:
'Mia: I like tea. Do you like tea?\nShen: No, I don’t. I like coffee.',
'Mia: I like tea. Do you like tea?\nShen: No, I don’t. I like coffee and music.\nMia: Do you like movies?\nShen: Yes, I do.',
readingQuestion: 'Shen 喜欢喝什么?',
readingAnswer: 'Coffee',
readingOptions: ['Coffee', 'Tea', 'Music'],
@@ -720,19 +784,21 @@ const a0Activities = <String, LessonActivity>{
independentHelp: 'I like … / Do you like …?',
),
'a0-10': LessonActivity(
listening: 'Please say that again.',
listeningQuestion: '对方希望什么?',
answers: ['再说一遍', '说慢一点', '写下来'],
speaking: 'Please speak slowly.',
listening: 'Do you like water? Sorry, please say that again.',
listeningQuestion: '第二个人希望对方做什么?',
answers: ['再说一遍', '说慢一点', '给他一杯水'],
speaking: 'Sorry, please say that again. I like water.',
speakingTip: 'water 的 t 常读得很轻,像轻轻的 d。先清楚,不必快。',
reading:
'Alex: Hi! I’m Alex. What’s your name?\nShen: Hi! I’m Shen. Nice to meet you.\nAlex: Nice to meet you, too. Where are you from?\nShen: I’m from Hong Kong. Where are you from?\nAlex: I’m from London. Do you like coffee?\nShen: No, I don’t. I like tea.',
readingQuestion: 'Shen 来自哪里、喜欢喝什么?',
readingAnswer: 'Hong Kong, tea',
readingOptions: ['Hong Kong, tea', 'London, coffee', 'Hong Kong, coffee'],
writingPrompt: '写姓名、地点和喜好三句。',
writingExample: 'I’m Shen.\nI’m from Hong Kong.\nI like tea.',
independentPrompt: '不看帮助,完成姓名、地点、喜好和反问。',
independentHelp: 'I’m … / I’m from … / I like …',
'Alex: Hi! I’m Alex. Where are you from?\nShen: Sorry? Please say that again.\nAlex: Where are you from?\nShen: I’m from Hong Kong. Do you like coffee?\nAlex: No, I don’t. I like water.',
readingQuestion: 'Alex 喜欢喝什么?',
readingAnswer: 'Water',
readingOptions: ['Water', 'Coffee', 'Tea'],
writingPrompt: '写姓名、地点和喜好三句,喜好用 water。',
writingExample: 'I’m Shen.\nI’m from Hong Kong.\nI like water.',
independentPrompt: '不看帮助:先请对方再说一遍,再说姓名、喜欢喝什么,并反问对方。',
independentHelp:
'Please say that again. / I’m … / I like water. / Do you like …?',
),
};
@@ -774,6 +840,7 @@ const a0SegmentActivities = <String, LessonActivity>{
listeningQuestion: '号码是多少?',
answers: ['138', '183', '318'],
speaking: 'My number is one-three-eight.',
speakingTip: '号码一个数字一个数字地读,数字之间稍停:one - three - eight。',
reading:
'Mia: What’s your phone number?\nShen: My number is five-zero-two.\nMia: Five-two-zero?\nShen: No. Five-zero-two.',
readingQuestion: 'Shen 最后确认的号码是哪一个?',
@@ -1187,10 +1254,10 @@ const a0IndependentRequiredTerms = <String, List<List<String>>>{
['i like', 'i love'],
['do you like', '#question'],
],
// 完成姓名、地点、喜好和反问
// 请对方重复,完成姓名、喜好和反问
'a0-10': [
['say that again', 'speak slowly', 'pardon'],
_introductionTerms,
["i'm from", 'i am from', 'from + #word'],
['i like', 'i love'],
['#question'],
],
@@ -1690,19 +1757,19 @@ const a0Dialogues = <String, LessonDialogue>{
'Say: Please say that again.',
'Say: Please speak slowly.',
'Now ask me your name or where I am from.',
'Say one thing you like.',
'Tell me what you like to drink.',
],
hints: [
'Please say that again.',
'Please speak slowly.',
'What’s your name?',
'I like tea.',
'I like water.',
],
translations: [
'请说:Please say that again(请再说一遍)。',
'请说:Please speak slowly(请说慢一点)。',
'现在请问我的名字或我来自哪里。',
'请说一件你喜欢的事物。',
'告诉我你喜欢喝什么。',
],
requiredTerms: [
['say that again', 'again', 'pardon'],
@@ -1716,7 +1783,7 @@ const a0Dialogues = <String, LessonDialogue>{
],
['i like', 'i love'],
],
taskLabels: ['请求对方重复', '请求对方放慢语速', '反问名字或来自哪里', '说出一件你喜欢的事物'],
taskLabels: ['请求对方重复', '请求对方放慢语速', '反问名字或来自哪里', '说出你喜欢喝什么'],
),
};