问题描述
在已有一定历史轮次的会话中,发送一个新问题后,整个会话界面会短暂变为空白,等待片刻后内容才重新加载出来。不是每次都复现,但频率较高。
用户场景
- 打开一个已有若干轮对话历史的会话
- 在聊天输入框输入新问题并发送
- 发送后,整个 Flow Chat 区域短暂白屏/空白
- 约 1-2 秒后内容重新渲染出来
- 新消息正常显示,历史消息也无丢失
环境信息
- 系统: Windows 11
- BitFun 版本: 0.2.11-nightly.20260626-dev
- 会话规模: 中等长度历史(非超大 session,几十轮左右)
可能的技术原因(初步分析)
1. 虚拟列表强制重建
新 turn 开始时,VirtualMessageList 的 pinTurnToTop 或 currentTurn 状态变更触发了组件 key 重置,导致 React 先卸载旧 DOM 子树再挂载新的——中间出现短暂空白。
相关代码路径:
src/web-ui/src/flow_chat/components/modern/VirtualMessageList.layout.test.ts
src/web-ui/src/flow_chat/components/modern/ModernFlowChatContainer.history-state.test.tsx
2. Loading Overlay 未被完全覆盖
PR #1077 修复了"首次打开大历史 session 先从轻量点击反馈开始,避免直接切到整页 loading",但这个保护可能只覆盖了打开会话路径,未覆盖发送新消息触发的新 turn 路径。
3. 投影状态竞争
latestProjection 和 currentTurn 的更新时序不同步——新消息到达后 latestProjection 先清掉了旧内容(为了切换到最新),但新内容还没完成渲染,中间出现短暂空窗。
PR #1109 修复了"历史窗口扩展时滚动位置跳动和重复锚定"的问题,但可能没有覆盖发送新消息后整个列表 re-anchor 的场景。
建议排查方向
- 在
start_dialog_turn / handleSendOrCancel 触发新 turn 时,检查 VirtualMessageList 的 key 或 turn prop 变化是否导致全量卸载/挂载
- 检查发送新消息后是否意外触发了
loading / isHydrating 标志位(特别是 loading toggle 的防护逻辑)
- 对比"打开历史会话"和"发送新消息"两条路径在
ModernFlowChatContainer 中的状态重置差异
关联 PR(供参考)
| PR |
内容 |
相关性 |
| #1077 |
历史会话渲染稳定性——防止 loading 回闪和裸白 |
高 |
| #1109 |
历史窗口扩展时保持滚动位置 |
中 |
| #1312 |
图片预览被侧边栏遮挡(已修) |
低 |
注:暂时没有录屏,如有需要可以补。问题复现频率不是 100%,但一天内会出现若干次。
问题描述
在已有一定历史轮次的会话中,发送一个新问题后,整个会话界面会短暂变为空白,等待片刻后内容才重新加载出来。不是每次都复现,但频率较高。
用户场景
环境信息
可能的技术原因(初步分析)
1. 虚拟列表强制重建
新 turn 开始时,
VirtualMessageList的pinTurnToTop或currentTurn状态变更触发了组件key重置,导致 React 先卸载旧 DOM 子树再挂载新的——中间出现短暂空白。相关代码路径:
src/web-ui/src/flow_chat/components/modern/VirtualMessageList.layout.test.tssrc/web-ui/src/flow_chat/components/modern/ModernFlowChatContainer.history-state.test.tsx2. Loading Overlay 未被完全覆盖
PR #1077 修复了"首次打开大历史 session 先从轻量点击反馈开始,避免直接切到整页 loading",但这个保护可能只覆盖了打开会话路径,未覆盖发送新消息触发的新 turn 路径。
3. 投影状态竞争
latestProjection和currentTurn的更新时序不同步——新消息到达后latestProjection先清掉了旧内容(为了切换到最新),但新内容还没完成渲染,中间出现短暂空窗。PR #1109 修复了"历史窗口扩展时滚动位置跳动和重复锚定"的问题,但可能没有覆盖发送新消息后整个列表 re-anchor 的场景。
建议排查方向
start_dialog_turn/handleSendOrCancel触发新 turn 时,检查VirtualMessageList的key或turnprop 变化是否导致全量卸载/挂载loading/isHydrating标志位(特别是 loading toggle 的防护逻辑)ModernFlowChatContainer中的状态重置差异关联 PR(供参考)
注:暂时没有录屏,如有需要可以补。问题复现频率不是 100%,但一天内会出现若干次。