Widget 状态
这一页讲的是 runtime continuity 当前会保留哪些交互态,以及这意味着什么。
如果你还没先看原理页,建议先读:
当前会保留哪些状态
现在 runtime continuity 会保留这些 RuntimeWidgetState:
- input cursor
- list selection
- table selection
- tabs selection
- scroll positions
这意味着 subtree replacement 或 full rerender 之后,这些交互态不会因为树重建而被重置。
Input
Input 保存的是 cursor 位置,不是字符串内容本身。
RuntimeWidgetState::InputCursor(cursor)输入值通常还是由你的 app state 或局部 signal 决定;continuity 负责的是“光标不要跳回开头”。
ListState
List continuity 保存的是当前选中项:
ListState::default().with_selected(Some(2))当你用键盘移动选择,再触发 rerender 时,runtime 会把这个选择态接回去。
TableState
Table 比 List 多一层:
- 选中行
- 可选的选中单元格
- 当前滚动窗口
这也是为什么 Table 的 continuity 更重要:它既有选择态,也有可视窗口状态。
Tabs
Tabs 当前保留的是“运行时维护的选中 tab”。
如果你显式传了 selected(...),那是 受控状态;
如果你没显式控制,runtime 会把用户切到的 tab 保留下来。
ScrollView / Scrollbar
滚动类组件保留的是位置:
ScrollView:offsetScrollbar:position
这让共享滚动状态、局部重绘和 continuity 三者能一起工作。
设计 widget 时该怎么想
如果你在设计一个新的交互型 widget,可以先问两个问题:
- 它有没有“用户刚刚操作出来的局部态”?
- 这些状态在 subtree replacement 后应不应该继续存在?
如果答案是“应该”,它通常就应该进入 continuity contract,而不是只活在临时节点里。
不属于 continuity 的是什么
这些东西通常不应该放进 RuntimeWidgetState:
- 业务数据
- 网络状态
- 长期持久化状态
- 纯视觉样式
换句话说:
- app state 负责“数据是什么”
- continuity 负责“用户正在操作到哪里”
Last updated on