SuperAPI AI 工具集

tauri-event-system

编程与开发

查看项目

更新于 10-15 09:09

技能介绍

用途

该技能聚焦 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()。资料未提供该技能的安装方式、收费信息、支持平台或版本要求。