debug-issue-timeline-flash.md
test/page/issue/issue_timeline_merge_test.dart
已把 replay 脚本 4 个 case 沉淀为 flutter_test,flutter test + flutter analyze 均 0 issue。命令:dart run tool/dbg/replay_issue_timeline_flash.dart
或(CI 友好):flutter test test/page/issue/issue_timeline_merge_test.dart
[case1] 修复后:合并 + wrapNext,两级消费后仍然含 timeline events
✅ 最终 dataList 长度 = 5 (3 comments + 2 events)
✅ 时间序升序(3 次相邻检查)
✅ 第一个事件是 labeled;最后一个事件是 closed
[case2] 反例:只合并 db res 不包装 next → 网络次消费清空 events
✅ 修复前二次消费后 timeline events 消失(复现 bug)
✅ 只剩 2 个 comments
[case3] 二次调用 decorate 幂等:长度 2 -> 2
[case4] 边界:null createdAt 排最后;res.data == null 不抛异常
labeled 事件正确插在 comment#101(t0) 与 comment#102(t2) 之间,
closed 事件正确排在 t3;用户任务 4 的要求满足。GSYListState.handleRefresh 在 res.next != null 时会二次 resolveRefreshResult(resNext),
把 dataList 清空并重新填入 —— 而 resNext 只包含 comments,没合并 timeline,从而覆盖第一次渲染的合并结果。_getHeaderInfo() 未 await,两级 .then 拉本地 db + 网络。第二次 setState 覆盖了
已加载的 labels/assignees/milestone。_refreshTimeline() 内部 try/catch 掉了异常,事件在网络失败时被清空。_decorateWithTimeline 之前用 is List<Issue> 判断,若 res.data 实际是 List<dynamic>
就跳过合并,导致某个分支只显示 comments。_getHeaderInfo 完成后 setState 抛错,帧被丢弃 —— 但用户报告的是
"一闪就没"(内容出现后消失),不是"一直空白",此假设优先级最低。_decorateWithTimeline 和 _wrapNextWithTimeline 的排序、合并、next 包装做黑盒验证。_timelineEvents = [[email protected], [email protected]] → 合并后按时间序、事件类型正确。GSYListState 的两级 refresh 场景。