ViewCompose State Snapshot
1. 文档定位
本文档定义 viewcompose-runtime 状态系统的 snapshot 语义与使用约束。
目标:
- 统一
MutableState的一致性读写语义 - 明确并发写入冲突处理规则
- 防止后续演进回退到“直接赋值 + 无事务”模型
2. 公开 API
mutableStateOf(value, policy)
默认策略:structuralEqualityPolicy()SnapshotMutationPolicy<T>equivalent(a, b):判定是否视为无变化merge(previous, current, applied):并发冲突合并,返回null代表无法合并
SnapshottakeSnapshot()takeMutableSnapshot()withMutableSnapshot { ... }currentGlobalId()
MutableSnapshotenter { ... }apply()dispose()
3. 核心语义
MutableState基于 MVCCStateRecord记录链实现,读取按readId选择可见版本。state.value = x在无显式 snapshot 上下文时,内部走 autocommit 事务(takeMutableSnapshot + apply)。MutableSnapshot.apply()为串行发布:- 无冲突:直接提交
- 有冲突:走
policy.merge(previous, current, applied) - merge 失败:
apply()返回Failure
- 读快照隔离:
Snapshot.takeSnapshot().enter { ... }始终读取该快照可见版本,不受后续全局提交影响。 ComposerLite每轮 compose 在一致性读快照中执行;同一轮内读取结果不漂移。- Runtime 跟踪活动 snapshot 的
readId;提交时保留活动读者所需版本,snapshot 释放后裁剪不再可见的历史记录。
4. 并发与冲突约束
- 冲突判定以状态记录版本为准:目标状态在事务
readId后产生新记录时视为并发写入。 equivalent(a, b)只负责判断一次赋值是否产生新记录,不用于推断事务是否并发。- 冲突默认不覆盖;仅当
merge提供可合并值时才可提交。 - 未提供 merge 能力(默认 policy)时,冲突应失败,由上层重试策略决定下一步。
5. 开发约束
- 禁止在 runtime 新增绕过 snapshot 的状态写入路径。
- 新状态容器若接入
RuntimeObservation,必须实现 snapshot 可见性语义。 - 修改策略或冲突语义时,必须同步补齐并发事务单测与 compose 一致性单测。
Snapshot/MutableSnapshot使用完成后必须调用dispose()或通过use关闭,避免长期保留历史版本。