用途
该技能聚焦 Tauri 应用中的事件系统,用于实现后端(Rust)与前端(TypeScript/React)之间的双向通信,以及多窗口之间的消息传递。它面向需要处理实时数据流、进度上报、日志推送、窗口间同步等场景的 Tauri 开发者。
主要能力
后端到前端事件
通过 window.emit 从 Rust 命令中向前端发送事件,前端使用 @tauri-apps/api/event 的 listen 订阅。示例展示了下载开始、下载完成等基础事件的发送与监听。
结构化事件负载
使用 serde::Serialize 定义带类型的结构体(如 ProgressEvent,包含 current、total、percentage、message、speed_mbps 字段),前端用对应 TypeScript 接口接收。还展示了使用 #[serde(tag = "type", content = "data")] 的枚举(AppEvent),实现带标签联合类型的事件,前端通过 switch 分支处理不同事件类型。
流式数据模式
包括基于 tokio::time::interval 的实时传感器数据流,以及使用 tokio::io::BufReader 逐行读取日志文件并按批次(每 10 行)发送的缓冲流模式。前端示例使用 React 的 useEffect 与 useState 累积读数。
多窗口通信
使用 app.emit_all 向所有窗口广播消息;使用 app.get_window 获取指定窗口后调用 window.emit 实现定向发送;还展示了通过后端中继实现窗口 A 到窗口 B 的消息传递(前端 invoke 调用后端命令,后端再向目标窗口 emit)。
前端到后端事件
前端使用 emit 发送自定义事件,后端在 setup 中通过 app_handle.listen_global 监听并处理。
监听器管理
提供 React 自定义 Hook useEvent 封装监听逻辑,以及 EventQueue 类实现事件队列模式,支持入队、出队、清空、停止与长度查询。还介绍了 once 用于一次性事件监听。
错误处理与性能
展示 emit_safe 辅助函数包装事件发送并记录错误;通过 Instant 与 Duration 实现节流(每 100ms 发送一次);通过累积批次(每 50 条)实现批量发送以减少序列化开销。
使用方式
后端使用 tauri::Window、tauri::AppHandle、tauri::Manager、tauri::Listener 等类型,配合 #[tauri::command] 宏定义命令。前端从 @tauri-apps/api/event 导入 listen、once、emit、UnlistenFn,从 @tauri-apps/api/core 导入 invoke。事件负载需在 Rust 侧派生 Serialize 与 Clone,前端侧定义对应接口。
适用场景
- 长时间运行任务的进度上报(如下载、处理)
- 实时数据流展示(传感器、日志)
- 多窗口桌面应用的状态同步与消息传递
- 前端用户行为上报到后端处理
- 初始化完成等一次性信号通知
限制与注意事项
资料中列出的最佳实践与常见陷阱包括:必须调用 unlisten() 清理监听器以避免内存泄漏;事件负载结构体必须派生 Serialize,否则运行时报错;高频事件需要节流或批量处理;建议使用命名空间前缀(如 "download:"、"user:"、"system:")组织事件名;一次性事件使用 once()。资料未提供该技能的安装方式、收费信息、支持平台或版本要求。