Delayed Session Container Checklist
1. 文档定位
本文档追踪“延迟创建 + holder/session 复用”容器的稳定性风险。
这类容器的共性是:
- 内容不会立即挂在父节点下
- 内部有 holder/session 复用
- 结构 diff 与可见内容刷新可能解耦
因此,它们是“结构不变但内容过期”问题的高风险区。
2. 当前已落地容器
LazyColumnLazyRowLazyVerticalGridHorizontalPagerVerticalPagerTabRow + pager page(页面内容通过LazyListItemSession承载)- Navigation destination page(页面内容通过
NavDestinationSession承载)
3. 架构硬约束
每个延迟 session 容器都必须满足:
- diff 为空时,不能回退到旧 item/page 实例
- 已绑定 holder/session 必须有“无结构变化刷新”路径
localSnapshot、主题、环境、父层闭包在 update 路径重新注入- 创建路径和更新路径都能驱动
RenderSession.render() dispose/recycle语义与 holder 生命周期对齐Change更新优先走 payload 通道,避免无条件全量变更通知- key 不可用回退
ReloadAll时,应尽量保持当前滚动锚点,避免交互后列表跳顶 - 输入控件获取焦点时,不应触发列表自动滚动跳位(除非显式滚动请求)
4. 必测场景
每个容器至少覆盖以下 6 类场景:
- 结构稳定、闭包变化:
key不变时可见内容立即更新 - 结构稳定、局部上下文变化:主题/local/environment 更新可见
contentToken变化:复用或受控重建语义符合预期- keyed reorder:顺序正确、状态不串位
- detach/attach/recycle:不泄漏、不丢状态
- 空 diff 刷新:
updates.isEmpty()时已绑定 holder 仍刷新
5. 当前测试映射(2026-03)
基础单测(通用机制):
当前已覆盖专项:
LazyColumn:collectionsStress_toggleUpdatesVisibleControls(UI)LazyVerticalGrid:collectionsGrid_spanToggle_refreshesVisibleItemContent(UI)TabRow + HorizontalPager:statePatchStress_refreshesStableTabContent(UI)HorizontalPager:statePatchStress_horizontalPagerContentUpdatesAcrossAdvances(UI)VerticalPager:statePatchStress_verticalPagerContentUpdatesAcrossAdvances(UI)LazyVerticalGrid/HorizontalPager/VerticalPager:NodeBindingDifferTest容器 patch 单测(U)LazyColumn:collectionsStress_rotateOrder_refreshesVisibleIdsAcrossToggles(UI)- Navigation destination:
NavDestinationSessionStoreTest覆盖候选离屏首帧、失败回滚、 Local/内容闭包刷新、显隐层级、永久移除和 owner 释放(U) - Transactional navigation host:
TransactionalNavHostCoordinatorTest覆盖 attach、 push/pop/replace/reset、揭页刷新失败、初始失败重试、重入串行化和生命周期封顶(U)
当前缺口(需补专项回归):
- Navigation destination 的真实 Activity 交互回归将在 Stage 4 公开 transactional
NavHost后接入;当前 Stage 3 仅暴露内部页面会话协议 - 门禁基线:
qaFull(Pixel 4 XL API 33)21/21 通过 - 基线更新(2026-03-07):
Lazy/Pager已统一走 DiffUtil + payloadChange路径,保留空 diff 刷新语义。 - 导航基线更新(2026-07-26):候选页面先离屏提交首帧,已提交页面刷新最新
UiLocalSnapshot与内容闭包,回滚/移除按 session → owner 顺序释放。 - 事务导航更新(2026-07-26):返回栈只在候选首帧或揭页刷新成功后提交;失败候选产生的 重入命令不会泄漏到旧栈。
6. 新容器接入流程
新增延迟 session 容器时,必须同步完成:
- 架构登记:在 overview.md 标记该容器
- 清单登记:加入本文档并补测试映射
- 单测:至少覆盖“diff empty but closure changed”
- instrumentation:补真实 Activity 交互回归
- diagnostics:确认 render/layout 诊断可观测
7. 排查优先级
遇到“文本没刷新 / 状态错乱 / 页面过期”时,固定按顺序排查:
- 是否属于延迟 session 容器
- diff 是否保留了最新 item/page 实例
- 绑定 holder 是否在空 diff 路径下触发刷新
- 最后再排查 demo 业务写法