SuperAPI AI 工具集

robius-state-management

通用与其它

查看项目

更新于 10-16 04:40

技能介绍

用途

本技能用于 Robius 状态管理模式的参考与落地,面向 Makepad 应用,整理自 Robrix 与 Moly 两个代码库的实践。当需要设计应用状态结构、实现状态持久化、通过控件树传递状态或跨会话管理 UI 状态时,可使用本技能。关键字包括:app state、makepad state、persistence、Scope::with_data、save state、load state。

来源代码库

  • Robrix:Matrix 聊天客户端,使用 AppState、SelectedRoom,并通过 serde 实现持久化。
  • Moly:AI 聊天应用,采用 Central Store 模式、异步初始化与 Preferences。

生产模式目录

资料列出 _base/ 目录中的生产级状态管理模式:

模式 说明
06-global-registry 使用 Cx::set_global 的全局控件注册表
07-radio-navigation 使用单选按钮的标签式导航
10-state-machine 基于枚举的状态机控件
11-theme-switching 使用 apply_over 的多主题支持
12-local-persistence 保存/加载用户偏好

主要能力

AppState 结构

提供应用级状态定义示例:AppState 包含当前选中的房间 selected_room、主视图的布局状态 saved_layout_state、按条目保存的状态 saved_state_per_item(如按空间的 dock 布局),以及是否登录 logged_in(通过 #[serde(skip)] 不持久化)。

SelectedRoom 为枚举,包含 JoinedRoom、InvitedRoom、Space 三种变体,提供 room_id() 与 upgrade_invite_to_joined() 方法,并按 room_id 实现相等性。

SavedLayoutState 保存布局快照:布局项 layout_items、已打开项 open_items、打开顺序 item_order、保存时选中项 selected_item。LiveIdSerde 为 LiveId 的可序列化包装。

通过 Scope 传播状态

在 handle_event 中使用 Scope::with_data(&mut self.app_state) 创建作用域,并传给控件树,使子控件可访问 AppState。子控件通过 scope.data.get::<AppState>() 读取,通过 scope.data.get_mut::<AppState>() 修改。

持久化层

  • 文件路径:latest_app_state.json 与 window_geom_state.json;persistent_state_dir 按用户 ID 生成用户专属目录,app_data_dir 提供应用级数据目录。
  • 保存:save_app_state 使用 serde_json 写入用户状态文件;save_window_state 保存窗口尺寸、位置与全屏状态。
  • 加载:load_app_state 异步读取,文件不存在时返回默认值;反序列化失败时记录错误、将旧文件重命名为 .json.bak 备份并返回默认值。load_window_state 在 UI 线程同步加载并调用 configure_window 恢复几何状态。

启动与关闭集成

启动时同步加载窗口几何状态,并通过 tokio 异步加载应用状态,成功后发送 AppStateAction::RestoreFromPersistence 并触发 UI 信号。关闭时(Event::Shutdown)同步保存窗口状态与应用状态。

线程本地状态(仅 UI)

使用 thread_local! 保存 UI 线程缓存,通过 get_ui_cache 与 clear_ui_cache 访问,要求传入 Cx 以确认在 UI 线程。

最佳实践

  • 区分持久化与运行时状态:用 #[serde(skip)] 标记不持久化字段。
  • 使用 Scope::with_data() 沿树传播,不通过控件引用传递状态。
  • 反序列化优雅回退,处理版本间格式变化。
  • 备份旧状态文件,格式变化时保留用户数据。
  • 按用户账号使用各自的持久化路径。
  • 窗口状态同步加载,应用状态异步加载。
  • 仅 UI 缓存使用 thread_local!,并以 Cx 参数作为线程守卫。

参考文件

  • references/persistence-patterns.md:附加持久化模式(Robrix)
  • references/state-structures.md:状态结构示例(Robrix)
  • references/moly-state-patterns.md:Moly 专属模式,包括集中式 Store 结构、load_into_app() 异步初始化、未加载时提前返回的应用状态检查、子模块状态管理器(Search、Downloads、Chats)、提供方同步状态跟踪、Store 动作转发到子模块。

适用场景

适用于 Makepad 应用(尤其参考 Robrix、Moly 结构)的状态结构设计、持久化实现、控件树状态传递和跨会话 UI 状态管理。

限制

资料未提供安装命令、收费与价格、支持平台、性能效果等信息,暂未提供。分类依据其用于 Makepad 应用状态管理与持久化的明确用途,归入通用与其它。