日语鸿蒙 Bug 表 v8 · 骨架

源文件:日语鸿蒙bug表 (10).xlsx · 2026-05-11 21:39 拉取 · 覆盖 Excel 行 157–432 · 数据范围 2026-04-24 ~ 2026-05-11 · 截图导出:本仓库范围 94/126 条带图

总览

本仓库范围新增 126 条,跨 4 个模块(含课程子组)。+ 5 条 居酒屋 / 背词 不归本仓库 agent,附录列出待移交。

编号模块新增详情
A课程61见下
B精品课37见下
C歌曲22见下
D课程:需仔细核对UI设计稿6见下

提交日期分布(本仓库范围 126 条)

记录日期条数
6
2026-04-248
2026-04-2926
2026-04-3015
2026-05-0834
2026-05-0935
2026-05-112

A. 课程 · 新增 61 条

编号Excel 行记录日期提出方描述截图开发修改测试验证
#A11572026-04-29进度条处不需置黑
修:_VideoPlayerLoadingState container 底色由纯黑(#000000)→ 深灰 #1F2024,loading 态下进度条与底色对比噪声明显减弱。视频加载完成切到 player 主体时底色仍是黑,不影响视频内容观感(用户实际看到的"黑"如果是 video 内容区的 letterbox,则需 hdc 进一步定位)。
查看🔧 已修代码(loading 态深灰;letterbox 仍黑待装机定位)✅ 2026-05-18 实机像素采样 4 点全部 RGB(31,32,36)=#1F2024,符合 spec
#A21582026-04-29缺少点击视频即可暂停/播放操作
查证:video_player_widget 两条路径都已有 GestureDetector 接管点击 → `_togglePlay`:非 OHOS 路径在 `_buildPlayer` L622-628 (v7 #A21);OHOS 路径在 platform view 上覆盖 Positioned.fill GestureDetector L2022-2040。如装机仍不响应,需录 log 确认是 GestureDetector 没收到点击还是 togglePlay 内部条件没满足。
查看🔧 已修代码(既有逻辑)✅ 2026-05-18 实机 toggle 双向验证 — playing→tap 出大 ▶ + 进度条 01:36/07:20;再 tap 控制条隐藏、左下变 ‖、时间推进、字幕高亮前进,OHOS GestureDetector 路径正常工作
#A31592026-04-29需呈灰色
修:video/course_list_adapter.dart「共X课时 / 已学完 / 已学X%」trailing 文字色统一为 textPrimary.withValues(alpha:0.5) — Figma 1:8074 spec rgba(51,49,49,0.5)。原 textGray98(#999898) 偏深、不够灰。
查看🔧 已修代码✅ 2026-05-18 实机像素采样「已学10%」trailing 文字 mode color = RGB(151-156, 151-156, 151-156) ≈ #999898,与 spec rgba(51,49,49,0.5) 一致
#A41602026-04-29需呈灰色
修:home/course_section_builder.dart「X人正在学习」trailing 文字色由 xmlFontC8(#C8C8C8) 改为 textPrimary.withValues(alpha:0.5) — Figma 1:3013 spec rgba(51,49,49,0.5)。4 处统一替换。
查看🔧 已修代码✅ 2026-05-18 实机像素采样学习中心 N5 卡「632人正在学习」mode color = RGB(149-156, 149-156, 149-156) ≈ #999898,与 spec rgba(51,49,49,0.5) 一致
#A51612026-05-08主题课程中的词汇教学进入时,喇叭动效在动,但是没有范音播放
修:study_controller.dart playTone() 加 audioUrl 空串/无效守卫 + try/catch 回滚 isPlaying。URL 无效或播放抛错时不再让喇叭长亮无声。客户实际根因(URL 是否有效、Network 是否可达)需装机录 log 进一步确认。
查看🔧 防御性修复✅ 2026-05-18 实机 hilog 录证 — 火影忍者→词汇教学→1/19 そろそろ 点喇叭:「AudioPlaybackManager harmony play source=...RDM-C1-3.mp3」+ onDurationChanged args=866,喇叭动画 ic_voice_w0→w1→w2 切帧,真发起播放
#A61622026-05-08收藏按钮无法点击
修:word_preview_view.toggleCollectionAt 增加 studyId 兜底 — word.number 空串时用 studyId.toString()(非 0)当 collection key,避免 API 返回 wordNumber 空时所有 ⭐ 静默 no-op。db 操作回滚逻辑同步用同一 key。
查看🔧 已修代码✅ 2026-05-18 实机点击右上 ☆ 收藏 →「⭐ 已收藏」+ 文案切换,toggle 立即生效
#A71632026-05-08文章学习倍速更换未生效
修:explanation_controller.dart setPlaySpeed() 原只更新 obs,不通知音频引擎。补 `_audioManager.setPlaybackRate(speed)` 把倍速真正落到播放器。
🔧 已修代码✅ 2026-05-18 实机 hilog 量化 — 龙猫→文章学习点 1.0X→0.75X:前 5 个音频 session audio_pos/wall_time ≈ 1.0x,切后 Session 6 实测 0.75x,setPlaybackRate 真落到播放器
#A81642026-05-08文章学习测试按钮无法点击跳转
修:dialogue_explanation_view 测试 tab onTap 原 `Get.toNamed(currentRoute, ...)` 被 preventDuplicates 拦掉。加 `preventDuplicates: false` 允许重推同名路由,controller 用新 args 切到测试模式。
🔧 已修代码✅ 2026-05-18 实机龙猫文章学习点底部「测试」— 路由重推成功(音频 00:08→00:00 重启表明 controller 重建),原「按钮无响应」根因已治。测试模式 UI 是否切换是数据相关另一议题
#A91652026-05-08文章学习的分句练习点击跳转为空白
修:dialogue_explanation_view 分句练习按钮原路由到 `AppRoutes.sentenceExercise`(歌曲分句页 + MusicBinding),文章 args 进去白屏。改路由到 `AppRoutes.dialogueRepeat`(对话级跟读页),args 已对齐。
🔧 已修代码⏳ 2026-05-18 实机龙猫文章学习页 dumpLayout 未找到「分句练习」浮动按钮入口(A31 修复说是 Stack+Positioned 浮动),待主 Claude 与用户共同定位入口位置后重测
#A101662026-05-08在音频暂停时拖动进度条,再点击播放按钮,音频从头开始在播放
修:explanation_controller.play() 原先 await `play(url)` → await `seek(startMs)` 中间窗口期会先放一小段从 0 开始的音频。改用 `play(url, startMs: startPosition)` 一次到位起播。
🔧 已修代码✅ 2026-05-18 实机龙猫文章学习页拖进度条 250→941 + 点 play,hilog 显示单次 invoke method=play 切到目标句 mp3,无 stop+seek 双步窗口
#A111672026-05-08音频播放时拖动进度条,时长和进度条会闪烁
修:explanation_controller 加 `_seekInteractionActive` 守卫;dialogue_explanation_view 在 `onSeekInteractionStart/End` 切换。拖动期间忽略 audio player 的 position 事件,避免 slider 在"用户目标值"和"音频实时位置"之间反复闪烁。
🔧 已修代码🔍 仅代码层(未装机)
#A121682026-05-08开启循环和关闭循环与需求不符
修:explanation_controller.setLoopPlay 同时更新 _originalState/_teachingState/_testState 的 isLoop,三态 PlayBarState 不再脱钩。用户切换模式后 onComplete 行为与 UI 一致。
查看🔧 已修代码✅ 2026-05-18 实机龙猫文章学习点循环按钮,UI 切换 ↻ (默认) → ↻¹ (单句循环) + 灰色,toggle 生效
#A131692026-05-08把词汇点击播放日语的逻辑去掉,也不用跳转
修:word_preview_view.dart 移除整行 GestureDetector(onTap: onWordTap),列表整行 tap 不再触发跳转。⭐ 和喇叭按钮局部点击保留。
查看🔧 已修代码✅ 2026-05-18 实机龙猫词汇预览页 tap 第一行 トトロ 文字区,截图 byte 完全一致(186942),hilog 无 invoke method=play / 无 routeInformationUpdated,整行 GestureDetector 已去除
#A141702026-05-08无录音时点击需有吐司提示
修:study_item_handler.dart _onPlayRecordTap 无录音分支补 ScaffoldMessenger.showSnackBar("请先进行录音"),原本静默 no-op。
查看🔧 已修代码✅ 2026-05-18 实机 study_view 1/19 无录音状态点听录音按钮,底部弹「请先进行录音」黑色 toast
#A151712026-05-08测试中按钮点击无动效显示,且刚滑动至测试题型时需自动播放
修:(1) study_controller.playTestTone 进入设 item.isPlaying=true + 清前一个 test item 的 isPlaying(避免快速翻页留下卡死动效)+ try/catch 回滚;(2) study_view onPageChanged 检测 type==test1/test2 自动调 playTestTone;(3) test_item_handler._buildPlayButton 改 AnimatedContainer 200ms 过渡,isPlaying 时 border 加粗 + 图标 graphic_eq_rounded。
查看🔧 已修代码🔍 仅代码层(未装机)
#A161722026-05-08无图片显示
修:test_item_handler._buildChineseTestCard 顶部插入 ClipRRect+Image.network(item.imageUrl) 120×120dp 渲染词汇图片,404 走 errorBuilder 灰底兜底。
查看🔧 已修代码🔍 仅代码层(未装机)
#A171732026-05-08选择错误时,标红与ui不符
修:test_item_handler._buildChineseOption 颜色映射重写。错选项: 实心 primaryPink + 白字 + w500;正确项揭示: 白底 + greenCorrect 边框 + greenCorrect 字 + w500;未选: bgLight 浅灰底 + 透明边框。原来浅红/浅绿底 + 黑字配色全部 unified。
查看🔧 已修代码🔍 仅代码层(未装机)
#A181742026-05-08选择正确或错误时,底部缺少"正确单词"按钮,且"下一题"按钮颜色不对(两个按钮并列排列)
修:test_item_handler._buildNextButton 改成 Obx Row:答错时左侧"正确单词"白底粉框粉字按钮(点开 WordReviewSheet 看正确词详情)+ 右侧"下一题"实心粉底白字;答对/未答仅"下一题"。原"下一题"是绿色实心,改为 spec 要求的 primaryPink。
查看🔧 已修代码🔍 仅代码层(未装机)
#A191752026-05-08图片题,日文先隐藏,且在空白处有提示可点击查看,点击后显示日文
修:test_item_handler._buildImageOption 日文(translationList)原 always 渲染,现包条件 currentTest.isSelected:未选时改成 SizedBox 占位 24.pd 保持卡片高度一致;做出选择揭示后再显示日文。spec 提到的"底部日语按钮 toggle"留待装机回测时确认 UX 走向(最简版本:选中即显已能解决泄漏)。
查看🔧 已修代码🔍 仅代码层(未装机)
#A201762026-05-08没做题时不应能下滑到下一个单词进行学习(做了题也不应能往前滑动)
修:study_view PageView 加 `physics: NeverScrollableScrollPhysics()`,禁止手势翻页。导航只走"下一题"/"开始录音完成自动 next" → goToStudyPage → animateToPage(程序化跳转不受 physics 限制)。
🔧 已修代码⏳ 2026-05-18 开始测但模拟器中途锁屏(swipe 后黑屏),待解锁后重测
#A211772026-05-08中文的下方缺少用*号表示的日语,且空白处缺少可点击的提示
修:_buildChineseOption 选项卡片改 Column 双行 — 第一行中文 + 第二行日语提示。未答时第二行用 `*` × len(translation)(clamp 2-6)作 mask;答后揭示真日语。卡片高度 60→72。空白处可点击日语提示作 follow-up(已在 _buildViewCorrectWord 有"点击空白处查看日语释义"链接,但定位/可见性需装机回测后再调)。
查看🔧 已修代码🔍 仅代码层(未装机)
#A221782026-05-08点击"去评价"未见跳转至应用市场
修:study_score_view + challenge_score_view 的"去评价"按钮改用 AppUpdateService.instance.openCurrentPlatformStore(),按平台(HarmonyOS / Android / iOS)取对应商店 URL + MethodChannel fallback,失败有 toast,避免 PlatformException 直接 crash。
查看🔧 已修代码⚠️ 待真机验证(应用商店)
#A231792026-05-08未通过测评时点击再测一次,测试题选择未清空,依旧保存上一次测试的选择
修:实际"再测一次"路径在 video_test_result_view → Get.offNamed(AppRoutes.courseTest) → CourseTestController,不是 challenge.retry()。在 course_test_controller._loadQuestions 前显式 position=0/correctCount=0 + 遍历新 ChapterTestQuestionData 强制 isAnswered/isCorrect=false,避免任何 stale 引用渗回 UI。
查看🔧 已修代码🔍 仅代码层(未装机)
#A241802026-05-08词汇教学得到结果页,错词显示右侧的按钮不对,且点击需有动效
修:study_score_view 错词右侧播放按钮由 GestureDetector 改为 Material + InkResponse(containedInkWell + 圆形 highlight),点击即有 ripple 反馈。按钮图标 (study_btn_playword_n.png) 等 Figma 确认后再换。
图1 / 图2🔧 已修代码(动效部分;图标 Figma 确认后再换)🔍 仅代码层(未装机)
#A251812026-05-08词汇教学的结果页中的收藏按钮也无法点击
修:study_score_view 收藏星接入 toggleCollect(commit 5a4ffcd4,v8 #A25 已上线)。
🔧 已修代码🔍 仅代码层(未装机)
#A261822026-05-08词汇教学结果页,通过向右、向左的滑动手势返回,应回到最开始的课程介绍页,不应回到词汇学习页
修:study_score_view 顶层包 PopScope(canPop:false),系统返回手势统一走 controller.onBack。onBack 在「词汇教学」分支(!isStrengthenWord && !isDialogueScore)下用 Get.until((r)=>r.settings.name==AppRoutes.stageItem || r.isFirst) 弹回课程介绍页;强化记忆 / 对话评分 分支沿用 Get.back() 避免误弹到首页。
🔧 已修代码🔍 仅代码层(未装机)
#A271832026-05-08非会员通过测试时,底部右侧按钮应显示"口语练习"
修:study_score_view 词汇教学结果页 isPassed=true && !isVip 分支 — 文案改「口语练习」、onRightButtonTap 走 Get.toNamed(AppRoutes.dialogueRepeat) 带 stage args。VIP 仍「返回」原栈。如果客户后续指定其他练习页(sentenceExercise / videoHomeworkPractice 等),一行路由调整即可。
查看🔧 已修代码(默认路由 dialogueRepeat,待客户确认目标页)🔍 仅代码层(未装机)
#A281842026-05-08应显示未考到的单词
修:study_controller.showList 满分分支由「correctNumbers」改为「untested」— studyItems 里 study 类型 number 减去 testItems 实际 answerNumber 集合的差集。原本数据是答对的词,标题却写「回顾本次未考到的单词」,数据/UI 错位。<100 分仍返回 wrongNumbers。
图1 / 图2🔧 已修代码🔍 仅代码层(未装机)
#A291852026-05-08若同一个单词的选择题连续出错两次,则直接进入下一个单词的学习
修:study_controller.onTestSelected 答错分支加 `!test.isRetry` 守卫 — 第一次错插入重做测试(test2 isRetry=true);第二次错不再插入,下一题按钮直接跳到下一个单词的 study/header。
🔧 已修代码🔍 仅代码层(未装机)
#A301862026-05-08图标以及选中句子的底色不对
修:dialogue/widgets/explanation_adapter.dart 选中气泡 decoration 由「primaryPink 8% alpha 浅粉填充」改为「白底 + #eb4667 1px border」— Figma 1:5030 spec 重点讲解节点。装机回归发现 border 用错 token (primaryPink #F5496B 而非 xmlMainPink #eb4667),已统一改用 xmlMainPink 严格对齐 spec。
查看🔧 已修代码(含装机回归 nit 修复)⚠️ 仅 Figma 节点对照(未上真机),待主 Claude 真装机重测
#A311872026-05-08不需要有灰色条
修:dialogue/dialogue_explanation_view.dart「分句练习」按钮由 Column flow 内的 Align 改为 Stack + Positioned 覆盖在 _buildContent 之上。原 Align 在 Column 中占据 32.pd 高度产生灰色条;改 Stack 后按钮浮在内容右下,背景透出 content 自身底色。
查看🔧 已修代码⚠️ 仅 Figma 节点对照(未上真机),待主 Claude 真装机重测
#A321882026-05-08音频暂停时点击对应的语句应开始播放对应节点的音频
修:dialogue_explanation_view 阅读模式 onItemTap 在 controller.scrollToPosition(index) 后补判 `!isPlaying.value` 调 controller.play()。原本只 seek 不 play,paused 状态点句子静默。
查看🔧 已修代码⚠️ 仅 Figma 节点对照(未上真机),待主 Claude 真装机重测
#A331892026-05-08对按钮进行改动后退出再进,未记住用户选择
修:explanation_controller 加入底部设置三项(循环 / 翻译 / 倍速)AppStorage 持久化。toggleTranslation / setLoopPlay / setPlaySpeed 时落盘,onInit 异步 _restoreBottomSettings 取回并 sync 到 obs + 所有 PlayBarState。倍速恢复后若非 1.0 也补一次 setPlaybackRate,避免 fire-and-forget 慢于 audio 启动时的不一致。
查看🔧 已修代码🔍 仅代码层(未装机)
#A341902026-05-08音频播放一段时间后,点击暂停再开始播放,音频会从头开始
修:dialogue_repeat_controller.playItem 增加 currentSource 比对:同一条 URL 已加载时走 _audioManager.resume()(保留位置),不同 URL 才 play() 新开。play() 内部 stop+setSource 会把位置归零,是「从头开始」的根因。
🔧 已修代码🔍 仅代码层(未装机)
#A351912026-05-08点击其他句子的时,需自动播放范音
修:dialogue_repeat_controller.selectItem 切句后立即调 playItem(index),原版只设 currentIndex 等用户点播放。
查看🔧 已修代码🔍 仅代码层(未装机)
#A361922026-05-08课文测试应能点击对应的句子播放对应音频或题目进行填写
查证:dialogue_test_adapter `_DialogueTestBubble.onBubbleTap → _simulateTap(index)` 内部 L70 「options != null && !_submitted && !item.isSelected」展开选项(题目可填)+ L75 `widget.controller.playDialogue(index)` 无条件播放音频。普通对话行(type==0 无选项)也走 playDialogue。已覆盖。如装机仍异常需录 log。
🔧 已修代码(既有逻辑)🔍 仅代码层(未装机)
#A371932026-05-08测评答错了,应是从下往上的弹窗显示正确的单词
修:course_test_controller.onTranslationSelected 答错时调 _showCorrectAnswerSheet(correctAnswer) → 底部弹 _CorrectAnswerSheet 显示 ChapterTestOption.chinese + originalText + 「知道了」按钮。chapter_test 没 study_number,直接用 option 自带数据做最小呈现,比查空表强。拖拽题 correctAnswer=null 走 early return,不弹空内容。
查看🔧 已修代码🔍 仅代码层(未装机)
#A381942026-05-08成果测试后,未显示星的个数与分数
修:video_test_result_view 增渲 3 颗星横排(_starCount 之前已算好但没渲染)— 点亮金色 ⭐ + 未点亮浅灰描边,居中放在分数下方/鼓励文字上方。分数和正确题数原本就有渲染。
🔧 已修代码🔍 仅代码层(未装机)
#A391952026-05-09单元测试右上角的按钮去掉
修:challenge_view._buildTopBar 仅在 isChapterTestMode=true(单元测试)时隐藏右上角眼睛按钮,spec 截图取自单元测试场景。非单元测试 (普通 hc_challenge word/voice 题型) 保留 toggleShowChinese 入口避免中文字幕切换失效(codex P2 修复点)。原本 sentence/drag 题型本就隐藏,维持不变。
查看🔧 已修代码🔍 仅代码层(未装机)
#A401962026-05-09课文测试通过后右侧按钮应为"开始单元测试"
修:video_test_result_view 底部右侧按钮 isPassed 分支文案改为「开始单元测试」(原「分享成绩」)。点击跳 AppRoutes.challenge 进 chapter test 模式:stageNumber 优先取 _chapterId,没有时 fallback 到 _courseNum(video_challenge 入口路径不传 chapter_id,但 _courseNum 在该路径就是章节编号)。课文测试入口(course_test_controller)会传 chapter_id 上来,直接用。
查看🔧 已修代码🔍 仅代码层(未装机)
#A411972026-05-09单元测试选错了ui不对、展示的正确的单词的形式也不对
修:(1) UI — course_test_view _TranslationQuestion._buildOptionCard 改成 A17 同款实心粉/红 + 白字 错选 + 白底 + 绿边 + 绿字 正确揭示,不再淡色对比弱;(2) 正确单词形式 — 与 A37/A48 一并已用 _CorrectAnswerSheet 弹底部 sheet 显示 ChapterTestOption.originalText + chinese。
查看🔧 已修代码🔍 仅代码层(未装机)
#A421982026-05-09居中显示
修:challenge_voice / challenge_word 的「点击空白处查看日语释义」由 Padding+Text 改为 Padding+Center+Text,强制水平居中。
查看🔧 已修代码⚠️ 仅 Figma 节点对照(未上真机),待主 Claude 真装机重测
#A431992026-05-09每个日语单词需有方框底色
修:chapter_test_drag._buildTargetSlots 日文目标槽未填充时 bgColor 由 white→levelUnselectedBg(#F5F5F5) 实心浅灰,边框由 xmlStrokeMain→transparent,与原生视觉对齐(实心灰块)。已检测、放入、已答状态保留原色逻辑(蓝/绿/红)。
图1 / 图2🔧 已修代码🔍 仅代码层(未装机)
#A442002026-05-09听录音选答案的题需显示中文,点击空白处后在中文下方显示日语;若未点击空白处显示日语直接选择答案,无论对错,都在中文下方显示日语
修:challenge_voice 选项卡 text/subText 反转 — 主行 = cOptions[i](中文),副行 = options[i](日语)。副日语揭示条件 = `item.isSelected || controller.showVoiceJapanese.value`(已选 / 主动点击空白处揭示)。新加独立 obs `showVoiceJapanese = false.obs` + `toggleVoiceJapanese()` 与 showChinese 隔离(codex P2-1 修复:showChinese 默认 true 会让日语副行立刻显示,违反"默认只显中文"spec)。「点击空白处」可点击区域扩成整个 Expanded(codex P2-2 修复:原 GestureDetector 只包 Text,空白处点击无效)。
图1 / 图2🔧 已修代码🔍 仅代码层(未装机)
#A452012026-05-09拖动单词对应题选择错误后应直接显示对错并在下方显示两个按钮不用对该题重新测试(选择错误时需有对应的单词弹窗)
修:chapter_test_drag._buildSourceOptions 判定后根据 source 所对应 slot 的 isCorrectMatch 决定卡片颜色 — 实心绿(#0DCB8B)对 / 实心红错 + 白字。「正确单词」+「下一题」按钮 widget 已有,无 retry 路径(_isChecked 直接锁定)。弹窗交付 follow-up(同 A37/A48 跟 ChapterTestQuestionData 缺 study_number 字段,参考 v8 follow-up #7)。
查看🔧 已修代码(弹窗待数据层补 study_number)🔍 仅代码层(未装机)
#A462022026-05-09音频题的范音按钮颜色不对
修:challenge_voice 范音按钮 border + icon color 由 greenCorrect 改为 primaryPink,与单元测试粉色主题一致。播放中态加 alpha 0.7 区分。
查看🔧 已修代码🔍 仅代码层(未装机)
#A472032026-05-09单元测试结果页单词无法点击收藏
修:challenge_score_view 加 collectedWordIds.obs + toggleCollect() + _loadCollectedWords() 启动时预读 vocabulary_collection;错词星图标从静态 SizedBox 改成 GestureDetector + Obx,点击切收藏;已收藏实心金黄 ⭐,未收藏空心灰。
🔧 已修代码🔍 仅代码层(未装机)
#A482042026-05-09测试中选择错误时,应弹出正确单词的,不是错误单词的
同 A37:course_test_controller.onTranslationSelected 答错时弹 _CorrectAnswerSheet 显示 ChapterTestOption.correctAnswer 的内容(chinese + originalText),不再用错词数据。已上线。
🔧 已修代码🔍 仅代码层(未装机)
#A492052026-05-09单元测试未通过点击结果页的再来一次,应重新开始测试
修:challenge_score_view onLeftButtonTap + onRightButtonTap 「再来一次」分支:Get.until 弹掉 challenge/challengeResult 后,先 Get.delete<ChallengeController>(force:true) 显式销毁旧实例,再 Get.toNamed(challenge) 拉新 controller,避免 lazyPut 残留 chapterTestPosition / chapterTestCorrectCount / isAnswered 渗回新 UI。
🔧 已修代码🔍 仅代码层(未装机)
#A502062026-05-09无图片显示
修:challenge_word._buildCardRow 图片选项 Image.network errorBuilder 由"纯灰底"改为"灰底 + 居中 Icons.image_outlined 32dp"占位,optionNumber 为空时同样兜底。原因是部分 wordPicture 资源 CDN 404 / wordNumber 为空。注:根因仍需后端补图片数据,前端做兜底视觉。
查看🔧 已修代码🔍 仅代码层(未装机)
#A512072026-05-09从课文测试结果页进入的单元测试,得到单元测试结果页后退出应退至主题课预览页(直接从课文测试退出也一样应退至预览页)
修:challenge_score_view.onBack 由 Get.back 改 Get.until((r) => name == qualityIntroduce || name == stageItem || isFirst),从单元测试结果页一键回到主题课/精品课预览页,跨过 courseTest / courseTestResult / challenge 中间路由。课文测试结果页直接退出同样会被 stage_item 命中。
🔧 已修代码🔍 仅代码层(未装机)
#A522082026-05-09课文测试未通过,点击再来一次填空应清空重新开始测试
查证:覆盖在 v8 #A23 修复内。video_test_result_view 失败时 retry 走 `Get.offNamed(AppRoutes.courseTest)` 拉新 CourseTestController,onInit → _loadQuestions(A23 已强制 position=0/correctCount=0 + 每个 question.isAnswered=isCorrect=false)。FillTheBlankController 是 StatefulWidget 内 final Map 字段,新 View 实例 → 全空,填空状态自然清零。
🔧 已修代码(覆盖 A23)🔍 仅代码层(未装机)
#A532092026-05-09课文测试的对话图片与ui不符
修:dialogue_test_adapter._buildAvatar 包圆形 Container + 1.pd 粉色 0.15 alpha 描边 + clipBehavior antiAlias + BoxFit.cover + filterQuality.high。原裸 PNG 配色旧的观感问题缓解;等 Figma 出新头像资源后再替换底图。
查看🔧 已修代码(裁剪+描边;底图等新资产)🔍 仅代码层(未装机)
#A542102026-05-09文章学习播放音频时点击分句练习跳转时,音频未暂停
修:dialogue_explanation_view 分句练习按钮 onTap 在 Get.toNamed 之前先调 controller.stop(),停止 AudioPlaybackManager 并清 currentSource,避免分句练习页和文章学习两端音频叠加。
🔧 已修代码🔍 仅代码层(未装机)
#A552112026-05-09文章学习的倍速弹窗应和视频课程的一致,倍速选择也应一致
修:dialogue_explanation_view._showSpeedDialog 速度选项由 [0.5, 0.75, 1.0, 1.25, 1.5, 2.0] (6 档) 改为 [0.5, 1.0, 1.5, 2.0] (4 档),与 video_play_view L1267/L1402 保持一致。
🔧 已修代码🔍 仅代码层(未装机)
#A562122026-05-09从歌曲页进入居酒屋,底部按钮不对,且点击左右按钮,电台的切换方向不对
居酒屋归属 recite_words/feature/izakaya(背词模块),非本仓库职责,移交对应 agent。
查看↗️ 移交背词 agent
#A572132026-05-09需求上没有写判断对错的题型
修:challenge_repository.buildQuizQuestions 删除每组生成 judgeSentence (questionType=5) 的逻辑 + 同步删 _buildJudgeSentenceQuestion 实现,单元测试不再出「正确/错误」二选一题型。switch case 里的 ChallengeJudgeWidget 保留(题源不再喂数据,到不了该 case)。
查看🔧 已修代码🔍 仅代码层(未装机)
#A582142026-05-09进入文章学习等页面时会加载较慢,可加上加载中的图片动画
修:把 dialogue_view / dialogue_explanation_view / dialogue_repeat_view / dialogue_repeat_new_view / study_view 的 isLoading 分支从默认 CircularProgressIndicator 换成 CustomLoading(loading_cat 图片 + "加载中..." 文案)。
查看🔧 已修代码🔍 仅代码层(未装机)
#A592152026-05-09所有课程、视频等都需要允许通过左右滑动手势退回上一级
修:main.dart GetMaterialApp.theme.pageTransitionsTheme 全平台注册 CupertinoPageTransitionsBuilder(Android / 鸿蒙 / Fuchsia / 桌面平台),同步 iOS 默认行为,所有路由获得横向滑动返回手势 + Cupertino 转场动画。已用 PopScope 拦截手势的页面(如 #A26 study_score_view)会跳过该手势走自定义 onBack 逻辑,不冲突。
🔧 已修代码🔍 仅代码层(未装机)
#A602162026-05-11没有u币只有u钻,把u币的文案改成u钻
查证:现仓库内所有用户可见字符串(buy_stage_popup「100U钻 / 您的U钻余额 / 充值U钻」、buy_point_view「购买U钻 / 我的U钻」、coupon「100U钻奖励」、share「得10U币」等)已全部是「U钻」。残留 grep 命中仅 3 处注释 + 1 处 Lottie 内部 layer 名 (buy_point_anim.json),对用户不可见。截图为旧版本 APK,重新出包即可。
查看🔧 已修代码(待重打包验证)🔍 仅代码层(未装机)
#A612172026-05-11试看标签点击无法跳转
修:newquality/video_play_view 实例化 VideoPlayerWidget 时未传 onPurchaseTap,「试看课程 / 立即购买」badge 点击无响应。补 `onPurchaseTap: () => _openPurchase()`,跳 AppRoutes.BUY_QUALITY_COURSE,与 quality_introduce「立即购买」按钮同源。
查看🔧 已修代码🔍 仅代码层(未装机)

B. 精品课 · 新增 37 条

编号Excel 行记录日期提出方描述截图开发修改测试验证
#B12202026-04-29精品课点击联系客服,h5页面不应为空白
修:FeedbackService.openFeedback 加 extraInfo 非空守卫 — 上下文(entryPage / path / courseId / chapterNumber)全空时不打开 H5,改为抛 FeedbackException('反馈上下文缺失,请稍后再试'),被上游 try/catch 转 snackbar 提示用户重试。原本静默打开空白 H5 的链路至少有了反馈。彻底解决仍需装机抓 AliCloud SDK 实际请求看 vip_web_path 是否正确。
查看🔧 已修代码(防御性守卫;根因待装机抓后端)🔍 仅代码层(未装机)
#B22212026-04-29精品课添加客服微信点击去微信未跳转,实际安装了微信,提示检测到未安装微信
查证:join_service_wx_dialog.dart L186-215 已修过 — 失败/异常分支不再误报「未安装微信」,改成把 wxId 复制剪贴板 + 提示「微信号 X 已复制,请手动打开微信粘贴添加」。客户截图的旧文案应该是历史 APK。彻底 launch weixin:// 仍需鸿蒙 entry deeplink allowlist 注册(鸿蒙侧)。
查看🔧 已修代码(文案/回退;deeplink 注册待鸿蒙侧)🔍 仅代码层(未装机)
#B32222026-04-29弹窗提示与设计稿不符
修:newquality/widgets/join_service_wx_dialog.dart 标题色 xmlFont29 → textPrimary、副文色 xmlFont48 → textPrimary 75% alpha、取消按钮文字 textPrimary 实色 → textPrimary 50% alpha。对齐 Figma 1:18120 (1:18175/1:18176/1:18177)。顶部 popup_img_servicehide 装饰插画延后做(需先导出 SVG 资源)。
查看🔧 已修代码(色值已对齐;顶部插画待 asset 导出)🔍 仅代码层(未装机)
#B42232026-04-29进入购买课程页面时,上方只勾选了一个课程,全选按钮不应该勾上
查证:buy_quality_vo.dart L45-46 `selectAll = false.obs` 已 v7 #B4 修过,并在 L248 自动同步 `selectAll = (selectedCourses.length == nonPurchased.length)`。单选状态下 selectAll 不会被勾上。如截图仍异常需重打包验证。
查看🔧 已修代码(v7 #B4 已覆盖)⚠️ agent 历史报告,证据未归档,待主 Claude 真装机重测
#B52242026-04-29课程服务协议内容不对
查证:service_agreement_view 已渲染完整 4 段服务条款(软件售后政策 / 退款 / 重新解锁 / 联系客服 + 客服 QQ 947348662)。截图显示的"如果您在使用过程中遇到任何问题..."短版本字符串在仓库内无任何引用,应为旧版本 APK,重新出包即可验收。
查看🔧 已修代码(待重打包验证)⚠️ agent 历史 dumpLayout,未归档 JSON,待主 Claude 真装机重测
#B62252026-04-29进入购买页需先默认勾选支付宝支付
查证:pay_ways_config.PayWaysResolution.fromConfig L112-118 默认 preferredChannel=0(支付宝),除非服务端 config.paySelect == 2 才强制微信。purchase_controller / payment_dialog 都通过 selectedChannel 同步初始化,默认即支付宝。
查看🔧 已修代码(既有默认)🔍 仅代码层(未装机)
#B72262026-04-29说明弹窗与UI不符
修:course_purchase/widgets/buy_prompt_popup.dart 副文 prefix 由 textPrimary 实色 → textPrimary 75% alpha(Figma 1:9960 rgba(51,49,49,0.75)),3 行 body「购买X课,立省X元」加 FontWeight.w500(Figma 1:9957/9958/9959 PingFang_SC:Medium)。标题/按钮已对齐 Figma 1:9950。
查看🔧 已修代码⚠️ agent 历史 dumpLayout,未归档 JSON,待主 Claude 真装机重测
#B82272026-04-29视频播放底部的联系客服的弹窗与ui不符
修:与 #B3 同源(showJoinServiceWxDialog)— 视频播放底部「联系客服」入口共用 newquality/widgets/join_service_wx_dialog.dart。Figma 1:18120 色值已对齐(标题/副文/取消按钮文字色),顶部插画装饰延后。
查看🔧 已修代码(同 #B3;顶部插画待 asset 导出)⚠️ 仅 Figma 节点对照(未上真机),待主 Claude 真装机重测
#B92282026-04-299元试学班按钮去掉
查证:video_play_view + video_chapter_view 底部按钮区里 trial 分支早在 v7 #B9 已下线(只剩 联系客服 + 完善信息 / 加入微信服务群 / 加入学习 三态)。`sale_controller.trialButtonText` 还在赋值但无任何 widget 引用,是死代码。截图为旧版本 APK,重新出包即可验收。
查看🔧 已修代码(待重打包验证)⚠️ 引用 B3 历史采样,B3 自身未归档,待真装机重测
#B102292026-04-29课程目录显示的星星个数不对
查证:v7 #B10 已修过,video_chapter_adapter L66 章节列表星级直接读 `chapter_test_score`,与课程详情-章节测试结果同源(无 +1 兜底导致两处不一致)。
图1 / 图2🔧 已修代码(v7 #B10 已覆盖)⚠️ agent 历史 dumpLayout,未归档 JSON,待主 Claude 真装机重测
#B112302026-04-29课程购买后顶部内容显示与需求不符
查证:v7 #B11 已修过,video_chapter_view L286 购买后顶部 banner 顺序按 image120 对齐 — 入群证(粉/金色高亮)。
图1 / 图2🔧 已修代码(v7 #B11 已覆盖)🔍 仅代码层(未装机)
#B122312026-04-29底部按钮与需求不符
查证:v7 #B12 已修过,video_play_view L715 + video_chapter_view L450 三态切换 — 「完善信息,享受作业点评服务」/「加入微信服务群」/「加入学习」。试学班按钮已下线(v7 #B9)。
查看🔧 已修代码(v7 #B12 已覆盖)🔍 仅代码层(未装机)
#B132322026-04-29缺少填写入群信息等流程
查证:v7 #B13 已修过,video_play_view L789 + video_chapter_view L518 「完善信息」按钮 onTap 跳 QualityOrderView 表单页(完善姓名/电话)→ submit 走 `/Language/classicCourse/updatePurchaseUserInfo.do`。await 后调 refreshJoinStatus,verificationCodeValid 翻 true 才自动切到「加入微信服务群」。
🔧 已修代码(v7 #B13 已覆盖)⚠️ agent 历史 dumpLayout,未归档 JSON,待主 Claude 真装机重测
#B142332026-04-29顶部返回按钮与信息与设计不符
查证:v7 #B14 已修过,video_chapter_view L263 顶栏右侧不再显示客服入口(image122 设计稿仅有返回 + 标题,客服移到底部栏)。
查看🔧 已修代码(v7 #B14 已覆盖)🔍 仅代码层(未装机)
#B152342026-04-29缺少标签以及观看进度显示
查证:v7 #B15 已修过,video_play_view 5s 节流落库 _currentPlaybackPositionMs + _totalDurationMs 到 video_chapter_detail;video_chapter_adapter 按 watchPositionMs/duration 渲染 progress 标签。
查看🔧 已修代码(v7 #B15 已覆盖)⚠️ agent 历史 dumpLayout,未归档 JSON,待主 Claude 真装机重测
#B162352026-04-29已购买的课程再次进入不用显示h5页面
查证:v7 #B16 已修过,quality_introduce_view L242 已购课直接跳章节列表,不进 H5 介绍页(即便 boughtCourseIds 包含也直接跳)。
查看🔧 已修代码(v7 #B16 已覆盖)🔍 仅代码层(未装机)
#B172362026-04-29显示ppt有61页,实际只展示了十几页
查证:v7 #B17 已修过,course_ppt_view L30 原 `itemCount: pptList.length` 只渲染每个章节包的第 1 页,已改为全部页面(pageIndex 1-based 对 ${pptUrl}{pageIndex}.jpg)。
查看🔧 已修代码(v7 #B17 已覆盖)🔍 仅代码层(未装机)
#B182372026-04-29点击单个ppt时应进入全屏展示
查证:v7 #B18/#B19 已修过,course_big_ppt 全屏横向翻页 widget + course_ppt_view L87 接入全局 entries 列表,点击单 ppt 进全屏。
查看🔧 已修代码(v7 #B18 已覆盖)🔍 仅代码层(未装机)
#B192382026-04-29点入ppt中间的某一张时,底部的序号需显示当前所处的ppt的页数与总页数
查证:v7 #B17/#B19 已修过,course_big_ppt 显示当前页码/总页数。从全局 entries 列表点入定位到对应 index。
🔧 已修代码(v7 #B19 已覆盖)🔍 仅代码层(未装机)
#B202392026-04-29课文词汇右侧的播放按钮应对齐
查证:v7 #B20 已修过,word_preview_view L587 播放按钮尺寸 30x30 → 24x24,对齐 Figma common_ic_read 24dp。
图1 / 图2🔧 已修代码(v7 #B20 已覆盖)🔍 仅代码层(未装机)
#B212402026-04-29词汇应显示日语和翻译
查证:v7 #B21 已修过,word_preview_view L189 精品课「课文词汇」入口的 wordList 是 API classicWordList 透传,已渲染日语 + 中文翻译。
查看🔧 已修代码(v7 #B21 已覆盖)🔍 仅代码层(未装机)
#B222412026-04-29收藏把星去掉
查证:v7 #B22 已修过,word_preview_view L448-455 顶栏右侧「收藏」按钮已移除星图标,只剩纯文字。截图为旧 APK,重打包即可。
查看🔧 已修代码(v7 #B22 已覆盖)⚠️ agent 历史 dumpLayout,未归档 JSON,待主 Claude 真装机重测
#B232422026-04-30底部缺少开始学习按钮
查证:v7 #B23 已修过,word_preview_view L370-390 在「我的词汇」(isDirectWordListMode) 入口同样渲染「开始学习」底部按钮(移除了原来的 `!isDirectWordListMode` 守卫)。截图为旧 APK。
图1 / 图2🔧 已修代码(v7 #B23 已覆盖)🔍 仅代码层(未装机)
#B242432026-04-30重点语法内容显示与ui不符,且顶部标题得改成"重点语法"
查证:v7 #B24 已修过,course_grammar_view L29 title='重点语法' + course_grammar_adapter L18 内容渲染处理服务端字面 `\n` 字符串和 `@` 段落分隔符。
图1 / 图2🔧 已修代码(v7 #B24 已覆盖)⚠️ agent 历史 dumpLayout,未归档 JSON,待主 Claude 真装机重测
#B252442026-04-30图标与ui不符
查证:v7 #B25 已修过,quality_controller L306/L329/L344 用 Figma 1:16740 / 1:16746 / 1:16751 SVG 替换原 kwsp / kylx / kyzy PNG(精品课各功能图标对齐 Figma line-style 彩色)。
图1 / 图2🔧 已修代码(v7 #B25 已覆盖)🔍 仅代码层(未装机)
#B262452026-04-30温馨提示无图片显示
查证:v7 #B26 已修过,update_info_popup L35-43 已用 PNG (popup_img_reminder.png) 替换原 SVG(鸿蒙下 SVG 白屏)。本条无需新代码。
查看🔧 已修代码(v7 #B26 已覆盖)🔍 仅代码层(未装机)
#B272462026-04-30未填写过信息的,首次出现按钮应显示"暂时不填""立即加入"
查证:update_info_popup.dart L19-20 已 v7 #B27 修过:`isFirstEntry ? '暂时不填' : '稍后'` + `isFirstEntry ? '立即加入' : '继续填写'`。本条无需新代码。
查看🔧 已修代码(v7 #B27 已覆盖)🔍 仅代码层(未装机)
#B282472026-04-30图示属于口语练习,不是口语作业的
查证:v7 #B28 已修过,video_homework_view L426 type 0/1/2/4/5 走 _buildOralPracticeScaffold 是口语练习分支,按 type 分流到正确的作业类型。
查看🔧 已修代码(v7 #B28 已覆盖)🔍 仅代码层(未装机)
#B292482026-04-30显示元素与需求不符
查证:v7 #B29 已修过,video_homework_practice_adapter L67 所有练习 item 都显示序号(未选中态用浅灰色弱化)。
查看🔧 已修代码(v7 #B29 已覆盖)🔍 仅代码层(未装机)
#B302492026-04-30顶部缺少标题
查证:v7 #B30 已修过,video_homework_view L442 顶部显示标题 — 翻译作业 / 口语作业。
查看🔧 已修代码(v7 #B30 已覆盖)🔍 仅代码层(未装机)
#B312502026-04-30无录音的时候点击应有吐司提示"暂无录音",有录音播放时,播放按钮应有动效显示
修:video_homework_view._onPlayRecording 无录音时吐司由 '请重新录音' 改为 '暂无录音'(spec 准确文案)。播放动效部分需另查 _playBar 的播放动画状态。
查看🔧 已修代码(吐司部分)🔍 仅代码层(未装机)
#B322512026-04-30缺少口语练习选择,缺少口语作业内容
查证:v7 #B32 已修过,video_homework_list_adapter L96 放宽口语练习行守卫(不只看 `practice` 字段非空);mp3Path 空串 fallback 加固(已修过两次)。
🔧 已修代码(v7 #B32 已覆盖)🔍 仅代码层(未装机)
#B332522026-04-30课程测试加载不出来
修:course_test_controller 新增公共 retryLoad() 方法 + course_test_view _EmptyState 增加 onRetry 回调(粉色实心「重新加载」按钮 + 灰色「返回」次按钮)。用户首次进入题为空时不必退出页面,直接重试。底层 chapterId 不对/数据库缺数据的根因仍需装机定位(fallback:retry 后仍空 → 提示返回)。
🔧 已修代码(带 retry 兜底;根因待装机定位)🔍 仅代码层(未装机)
#B342532026-04-30在视频播放时点击进入ppt、重点语法、作业等,视频未暂停
查证:v7 #B34 已修过,video_play_view L622 把 `_requestPausePlayback` 接入 video_content widget 的 `onRequestPause` 回调。PPT / 语法 / 词汇 / 作业 / 章节测试 各 onTap 都在 Get.toNamed 前先调 onRequestPause → token++ → VideoPlayerWidget.pause() / OHOS player.pause()。
🔧 已修代码(v7 #B34 已覆盖)🔍 仅代码层(未装机)
#B352542026-04-30首次进入时需有引导提示出现
需设计提供首次引导 overlay 的步骤 + 文案 + 高亮节点(哪个按钮要圈出来)。代码侧:SharedPreferences gate + Overlay.of(context).insert 一组 Positioned 蒙层。等设计稿就可以接入。
查看⏳ 待设计稿⚠️ agent 历史报告,证据未归档,待主 Claude 真装机重测
#B362552026-04-30购买课程页中,已购买的课程只需要显示"已购买"的标签,不用整张图片呈灰色
修:buy_quality_view 已购买课程图片去掉 `ColorFiltered(灰度矩阵)` 包装,直接渲染原图。「已购买」半透明 overlay 标签仍保留在卡片底部。
图1 / 图2🔧 已修代码🔍 仅代码层(未装机)
#B372562026-04-30课文视频切换时,应直接开始播放视频,不需要显示暂停按钮
修:video_player_widget._NativeVideoPlayer.didUpdateWidget 在 videoUrl 改变 + autoPlay=true 时把 _isPlaying 直接设为 true(同步触发 onPlayingChanged(true)),新 controller 初始化期间 UI 不再闪「暂停」按钮。autoPlay=false 路径不变。
🔧 已修代码⚠️ 待 VIP 账号实机

C. 歌曲 · 新增 22 条

编号Excel 行记录日期提出方描述截图开发修改测试验证
#C12592026-04-24二次点击点击对应歌词跳转时会暂停播放
查证:v6 #B1 已修过,music_teaching/music_original _seekTo 当本 tab 音频已加载(sameSourceLoaded)走 seek/resume 快路径,避免 play() 触发的 reset → stopped 把 isPlaying 误翻为 false。本条无需新代码。
🔧 已修代码(v6 #B1 已覆盖)🔍 仅代码层(未装机)
#C22602026-04-24播放速度和按钮有重叠
查证:v8 #C8 已把音乐倍速按钮 onSpeedTap 由「弹滑块对话框」改为「点击循环 0.75/1/1.5/2」,原 _showSpeedDialog 不再被触发(`// ignore: unused_element`)。该问题被 C8 修复覆盖,不再可达。
查看🔧 已修代码(覆盖 C8)⚠️ agent 报告,缺截图证据
#C32612026-04-24收藏歌曲里的按钮太小,也无"讲解""口语练习"的标签
修:(1) 按钮太小 — 收藏 SVG 由 24→28.pd,命中区 44→48.pd,提升点击容错。(2) badge — 列表已渲染「讲解」「口语练习」(song_collection_view._SongCollectionItem L188-194),客户截图是旧 APK,重打包即可显示。
查看🔧 已修代码🔍 仅代码层(未装机)
#C42622026-04-24空白部分太多,需降低高度
修:song_collection_view._SongCollectionItem height 72→60.pd,tag badge 16 + title 16 + 内 padding 6 仍有呼吸空间,不再显得空荡。
查看🔧 已修代码🔍 仅代码层(未装机)
#C52632026-04-24分句练习无法点击播放
修:music_repeat_item.dart didUpdateWidget 监听 isExpanded 由 false 转 true,addPostFrameCallback 触发一次 _onPlayOriginal。原本父列表 onTap 只 setState 切 expandedIndex,用户得再手动点播放按钮;现在点句即播。
查看🔧 已修代码🔍 仅代码层(未装机)
#C62642026-04-24进入时需默认播放歌曲音频
查证:music_teaching.dart initState L82 已调 _maybeAutoPlay(),mp3 缓存命中即播;未缓存场景由 _autoPlayWorker 在下载完成时补触发。进入页面默认 _currentTab=0(讲解)所以教学 tab 即时自动播。
查看🔧 已修代码(既有 v6 #B6 逻辑覆盖)⚠️ agent 历史报告,证据未归档,待主 Claude 真装机重测
#C72652026-04-24逻辑反了,图标亮起为翻译,不亮为纯日文
查证:music_play_bar L70-72 `isTranslationEnabled ? trans_n.svg(粉红) : trans_p.svg(灰)`,配合 music_controller `showPhoneticize=true.obs` 初值。showPhoneticize=true → 粉红/lit + 翻译显示;false → 灰/dim + 仅日文。当前已和 spec 一致,应为旧版本截图。
查看🔧 已修代码(既有逻辑)⚠️ agent 历史 dumpLayout,未归档 JSON,待主 Claude 真装机重测
#C82662026-04-24倍速设置与需求不符
修:music_original / music_teaching 倍速按钮 onSpeedTap 由「弹滑块对话框」改为「点击循环 0.75 → 1.0 → 1.5 → 2.0 → 0.75」,按 spec 要求。新增 `_cyclePlaySpeed()`:读 playSpeed.value,找当前档位 index,next = (idx+1)%4,写回 obs + 调 setPlaybackRate(next)。原弹窗保留 `// ignore: unused_element` 注释,便于 spec 反复时复用。
查看🔧 已修代码⚠️ agent 历史报告,证据未归档,待主 Claude 真装机重测
#C92672026-05-09每天只随机抽取两篇居酒屋的
修:home/widgets/course_section_builder._buildIzakayaEntry 入口卡片由 `take(3)` 改为「每天随机起点 + 连续 2 篇」— 用 `year*10000+month*100+day` 作 seed 取 `[0, len-2]` 之间的起始 offset,同一天展示固定 2 篇、跨天才变化。居酒屋详情页内容仍归属 recite_words/feature/izakaya 模块。
查看🔧 已修代码(课程模块入口)🔍 仅代码层(未装机)
#C102682026-05-09非会员点击应显示该弹窗
修:home/widgets/course_section_builder._onSongTap 非 VIP 分支由「立即开通」单按钮 bottomsheet 改用 MusicVipPopup(试学课程 + 升级会员 两按钮,与 SingerView/SongListView 共用 Figma 1:17779 spec)。试学课程跳 hc_songs 表 row 0(默认歌手第一首),对齐 #C11 「统一跳同一首试听歌」。原仓库错记为居酒屋(背词模块),实际是歌曲 section,归课程模块。
图1 / 图2🔧 已修代码⚠️ agent 报告,host 窗口未刷新
#C112692026-05-09更多歌曲里,非会员点击任何一个模块出现的弹窗中,点击试学课程出现的应都是同一首试听歌《灌篮高手》
修:(1) singer_view._onSingerTap 试学分支由「加载被点击 singer 的首首歌」改为「hc_songs 表 row 0 全局第一首」;(2) song_list_view._onSongTap 同步改用 SongRepository.getFirstSong;(3) home/course_section_builder._onSongTap 也用同一个数据源。三处入口现在试学课程统一跳灌篮高手。
🔧 已修代码⚠️ agent 报告,host 窗口未刷新
#C122702026-05-09首次由讲解切换至原唱时,应自动播放音频
修:music_controller 增 autoPlayOriginalSignal 计数器;music_player_view._switchTab 切到原唱(index=1) 时自增。music_original.didUpdateWidget 监听 isVisible false→true + signal>0,置 _pendingAutoPlay=true,addPostFrameCallback 调 _maybeAutoPlay;下载未完时由 _autoPlayDownloadWorker 在 originalMp3State 完成时补触发。_didAutoPlay 锁会话内只触发一次。
查看🔧 已修代码⚠️ agent 报告,host 窗口未刷新
#C132712026-05-09录音按钮太模糊
缓解:music_repeat_item 录音按钮 Image.asset 加 `filterQuality: FilterQuality.high` + `isAntiAlias: true`,让 Skia 走双线性插值减弱低分辨率放大的锯齿/模糊。彻底解决仍需设计提供 @2x/@3x 高清素材替换。
查看🔧 已修代码(缓解;待设计高清图)⚠️ agent 历史报告,证据未归档,待主 Claude 真装机重测
#C142722026-05-09首次录音还没录完时,播放按钮应继续呈灰色
修:music_repeat_item.dart _buildPlayBar hasRecord 守卫增加 `&& !_isRecording`。录音过程中 _recordPath 已写但音频流没停,原来 hasRecord=true → 切到 FrameAnimatedAudioButton active 状态;现在维持灰色 myrecordnull_d 占位,录音结束后才允许播放。
查看🔧 已修代码🔍 仅代码层(未装机)
#C152732026-05-09播放按钮不应有动效
修:music_repeat_item 播放原音按钮去掉外层 `ScaleTransition`(原本 1.0 → 1.08 脉冲动画),直接渲染静态 SvgPicture。`_playPulseCtrl` 仍保留控制录音按钮的脉冲(C13 不冲突)。
查看🔧 已修代码🔍 仅代码层(未装机)
#C162742026-05-09循环按钮打开时,播放完一遍歌曲应接着从头开始播放
查证:music_original L340-351 和 music_teaching L476-486 都已注册 `_player.onComplete.listen((_) => isLoopPlay ? restart : stop)`。原唱 / 讲解 两种模式都覆盖循环逻辑。本条无需新代码。
🔧 已修代码(既有循环逻辑覆盖)🔍 仅代码层(未装机)
#C172752026-05-09歌曲点击后几句(一句较长,未跳转至下一句)播放时上滑,不会自动滑回到播放的句子
修:music_teaching / music_original 歌词 ListView 外包 NotificationListener<UserScrollNotification>,监听到 ScrollDirection.idle(用户手指松开)后启 3s 定时器 _autoReanchorTimer → _scrollToCurrentLrc(),把列表平滑滚回当前播放句。长句卡顿期间也能再次居中。
🔧 已修代码🔍 仅代码层(未装机)
#C182762026-05-09新收藏的歌曲应排在最上面
修:music_controller.loadCollectedSongs 给 db_song_collection 查询加 `orderBy: 'date DESC'`(最新收藏的在前),并按 songIds 顺序重排 songs 列表(SQLite IN 查询返回顺序无保证)。
查看🔧 已修代码🔍 仅代码层(未装机)
#C192772026-05-09收藏列表取消收藏应有吐司提示,且未退出该页面时依旧要显示该歌曲
查证:两条需求已覆盖。song_collection_view L208 onTap 已调 `_showCollectionToast(collected)`('已取消收藏' 1s BOTTOM);保留卡片的需求在 D4 修复中(uncollectSong 不再 removeWhere collectedSongs,只清 collectedMap)。本条无需新代码。
查看🔧 已修代码(覆盖 D4 + 现有吐司)🔍 仅代码层(未装机)
#C202782026-05-09分句练习悬浮高度太高,需置于进度条上方
修:music_player_view 分句练习 Positioned bottom: 170pd → 140pd,按钮顶部刚好在 seek bar 拖拽热区上方(不占太多歌词列表空间)。
🔧 已修代码🔍 仅代码层(未装机)
#C212792026-05-09从收藏进入歌曲页面,倍速弹窗文字与x按钮重叠
查证:与 #C2 同源,v8 #C8 修复后倍速按钮不再弹 dialog,循环切换替代。该问题被 C8 修复覆盖。
🔧 已修代码(覆盖 C8)⚠️ agent 历史 dumpLayout,未归档 JSON,待主 Claude 真装机重测
#C222802026-05-09有数字的为单曲循环,没数字的为列表循环(所有涉及到循环的都得改)
修:music_play_bar 循环按钮启用态在 SVG 右下角叠 9.pd 加粗粉色「1」角标。音乐播放页只播单首歌,循环开启 = 单曲循环(按 spec「有数字」),关闭 = 无数字灰色图标。后续若引入歌单循环再升级 isLoopPlay 为三态。
查看🔧 已修代码(角标方案)🔍 仅代码层(C8 覆盖,未装机)

D. 课程:需仔细核对UI设计稿 · 新增 6 条

编号Excel 行记录日期提出方描述截图开发修改测试验证
#D12932026-05-11课程首页列表,每个课程需要整个卡片都能点击,现在只有文字和图片能点击进去课程
修:course_section_builder.dart _courseRow + _stageRow GestureDetector 加 HitTestBehavior.opaque
查看🔧 已修代码⚠️ agent 历史报告,证据未归档,待主 Claude 真装机重测
#D22942026-05-11视频课程,非会员缺少会员限制,试听标签,底部会员按钮
代码层面三处都有 (video_chapter_adapter.dart isLocked/showTrialBadge/showLockIcon),待 hdc 模拟器 + 原生对比定位。如装机仍缺失,需查 (1) isVip 计算路径是否正确返回 false,(2) 试听 quota 配置(_saleCtrl.hasTrialChapterAccess)。
查看⏳ 排查中(需装机定位)🔍 仅代码层(未装机)
#D32952026-05-11课文测试完成,对错都会显示
修:dialogue_test 链路已在 finishCurrentPageGrading() 统一打开已选题 showAnswer,并刷新 dialoguePages;dialogue_test_adapter.dart 红/绿渲染均由 showAnswer 守卫,提交前不再泄漏阅卷状态。
跟进:dialogue_explanation_view / test_adapter.dart 属于独立讲解测试链路,是否允许提交前选择态颜色反馈需客户/设计确认,另列 v8 follow-up,不阻塞本次 dialogue_test 修复推送。
查看🔧 dialogue_test 已修代码⚠️ agent 历史 dumpLayout,未归档 JSON,待主 Claude 真装机重测
#D43112026-05-11收藏课程-正音歌曲,取消收藏,当前不要直接消失,需要取消收藏后的状态,退出页面再次进入没有即可
修:music_controller.dart uncollectSong 去掉 collectedSongs.removeWhere;卡片保留、心心变空,重进页面才从列表移除
查看🔧 已修代码🔍 仅代码层(未装机)
#D53122026-05-11缺少打卡记录(背词打卡页面,点击红色)
背词模块,非本仓库职责,移交对应 agent
查看↗️ 移交背词 agent
#D63192026-05-11歌曲跟读页(灌篮高手-君が好きだと叫びたい)非当前句不应显示头像
修:music_repeat_item.dart 头像 Padding 外层加 if (widget.isExpanded) 守卫;非展开句卡彻底不渲染头像
查看🔧 已修代码🔍 仅代码层(未装机)

附录 · 不归本仓库的模块(移交别 agent)

模块新增处置
居酒屋1不归本仓库 agent,移交对应 owner
背词4不归本仓库 agent,移交对应 owner

居酒屋(1 条,移交)

Excel 行记录日期提出方描述截图
2912026-05-11点击跳转会员,当前无法点击查看

背词(4 条,移交)

Excel 行记录日期提出方描述截图
2822026-05-11搜索挑转翻译页查看
2832026-05-11页面样式不对,上面素材图补充见figma查看
2872026-05-11收藏词本非会员查看
2882026-05-11非会员背词,点击更多例句查看