Skip to content

发送新消息后会话界面短暂空白/重新加载 #1321

Description

@oceaman

问题描述

在已有一定历史轮次的会话中,发送一个新问题后,整个会话界面会短暂变为空白,等待片刻后内容才重新加载出来。不是每次都复现,但频率较高。

用户场景

  1. 打开一个已有若干轮对话历史的会话
  2. 在聊天输入框输入新问题并发送
  3. 发送后,整个 Flow Chat 区域短暂白屏/空白
  4. 约 1-2 秒后内容重新渲染出来
  5. 新消息正常显示,历史消息也无丢失

环境信息

  • 系统: Windows 11
  • BitFun 版本: 0.2.11-nightly.20260626-dev
  • 会话规模: 中等长度历史(非超大 session,几十轮左右)

可能的技术原因(初步分析)

1. 虚拟列表强制重建

新 turn 开始时,VirtualMessageListpinTurnToTopcurrentTurn 状态变更触发了组件 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. 投影状态竞争

latestProjectioncurrentTurn 的更新时序不同步——新消息到达后 latestProjection 先清掉了旧内容(为了切换到最新),但新内容还没完成渲染,中间出现短暂空窗。

PR #1109 修复了"历史窗口扩展时滚动位置跳动和重复锚定"的问题,但可能没有覆盖发送新消息后整个列表 re-anchor 的场景。


建议排查方向

  1. start_dialog_turn / handleSendOrCancel 触发新 turn 时,检查 VirtualMessageListkeyturn prop 变化是否导致全量卸载/挂载
  2. 检查发送新消息后是否意外触发了 loading / isHydrating 标志位(特别是 loading toggle 的防护逻辑)
  3. 对比"打开历史会话"和"发送新消息"两条路径在 ModernFlowChatContainer 中的状态重置差异

关联 PR(供参考)

PR 内容 相关性
#1077 历史会话渲染稳定性——防止 loading 回闪和裸白
#1109 历史窗口扩展时保持滚动位置
#1312 图片预览被侧边栏遮挡(已修)

注:暂时没有录屏,如有需要可以补。问题复现频率不是 100%,但一天内会出现若干次。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions