SuperAPI AI 工具集

tauri-syntax-state

编程与开发

查看项目

更新于 10-15 22:18

技能介绍

用途:面向 Tauri 2.x 应用的状态管理,帮助在命令之间共享数据、注册应用状态,并排查与状态相关的 panic、Mutex 死锁等问题。

主要能力:

  • 状态注册:Builder::manage(T) 在构建期注册;App::manage(T) 在 setup() 钩子中注册依赖初始化的状态;AppHandle::manage(T) 在运行时注册(少见)。
  • 状态访问:命令参数用 State<'_, T> 由 Tauri 自动注入;任意持有 AppHandle 的代码可用 app_handle.state::<T>()(未注册会 panic)或 app_handle.try_state::<T>()(返回 Option,安全)。
  • 线程安全包装:std::sync::Mutex<T> 用于可变状态且锁内不 .await;tokio::sync::Mutex<T> 用于锁内需 .await;std::sync::RwLock<T> 用于读多写少;只读配置可直接用不可变类型。
  • Manager trait 由 App、AppHandle、Window、Webview、WebviewWindow 实现,均可调用 state() 与 try_state()。
  • 可同时注册多个独立状态类型,数量不限。

关键限制与警告:

  • State<', T> 的类型必须与注册类型完全一致,否则运行时 panic(非编译期)。注册 Mutex<Counter> 时参数须为 State<', Mutex<Counter>>。
  • 不要用 Arc 包裹托管状态,Tauri 内部已用 Arc 包装。
  • 同一调用链中不要重复锁定同一 Mutex,否则死锁。
  • 除非需要跨 .await 持锁,否则优先 std::sync::Mutex。
  • 必须在任何命令访问前注册状态,否则 State<T> 会运行时 panic。

使用方式:在 Builder 链或 setup() 中 manage 注册,命令签名注入 State,按需选择 Mutex/RwLock 并正确加锁。参考链接包括 references/methods.md、references/examples.md、references/anti-patterns.md,以及官方文档 https://v2.tauri.app/develop/state-management/、https://docs.rs/tauri/2/tauri/struct.State.html、https://docs.rs/tauri/2/tauri/trait.Manager.html。