Skip to Content
APIWidget 状态

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

TableList 多一层:

  • 选中行
  • 可选的选中单元格
  • 当前滚动窗口

这也是为什么 Table 的 continuity 更重要:它既有选择态,也有可视窗口状态。

Tabs

Tabs 当前保留的是“运行时维护的选中 tab”。

如果你显式传了 selected(...),那是 受控状态; 如果你没显式控制,runtime 会把用户切到的 tab 保留下来。

ScrollView / Scrollbar

滚动类组件保留的是位置:

  • ScrollView:offset
  • Scrollbar:position

这让共享滚动状态、局部重绘和 continuity 三者能一起工作。

设计 widget 时该怎么想

如果你在设计一个新的交互型 widget,可以先问两个问题:

  1. 它有没有“用户刚刚操作出来的局部态”?
  2. 这些状态在 subtree replacement 后应不应该继续存在?

如果答案是“应该”,它通常就应该进入 continuity contract,而不是只活在临时节点里。

不属于 continuity 的是什么

这些东西通常不应该放进 RuntimeWidgetState

  • 业务数据
  • 网络状态
  • 长期持久化状态
  • 纯视觉样式

换句话说:

  • app state 负责“数据是什么”
  • continuity 负责“用户正在操作到哪里”
Last updated on