1. 监听事件(前端监听 Rust)
在 Rust 端,你可以通过 app_handle 随时向所有前端窗口发送事件。典型用途是:文件自动保存完成、网络状态变化、后台任务进度更新等。
Rust 发送事件:
use tauri::Manager;
#[tauri::command]
fn start_task(app_handle: tauri::AppHandle) {
// 模拟耗时操作
std::thread::spawn(move || {
for i in 1..=100 {
std::thread::sleep(std::time::Duration::from_millis(50));
// 向所有窗口发送进度事件
let _ = app_handle.emit("task-progress", i);
}
});
}
前端监听(以 JavaScript 为例):
import { listen } from '@tauri-apps/api/event';
// 开始监听事件
const unlisten = await listen('task-progress', (event) => {
console.log('进度:', event.payload); // payload 就是 Rust 发来的 i 值
// 更新 UI 进度条...
});
// 如果不再需要监听,可以取消
// unlisten();
listen 返回一个取消监听的函数,非常适合在组件卸载时调用,避免内存泄漏。
2. 发送事件(前端触发 Rust)
前端也可以把消息推送给 Rust,让后端执行相应的逻辑。这实际上是通过 emit 方法直接向 Rust 发送事件,而 Rust 则需要通过设置监听器来接收。
前端发送:
import { emit } from '@tauri-apps/api/event';
// 比如用户点击“开始备份”按钮
await emit('start-backup', { path: '/home/user/docs' });
Rust 监听:
use tauri::Manager;
fn main() {
tauri::Builder::default()
.setup(|app| {
let handle = app.handle();
// 监听前端发送的 'start-backup' 事件
app.listen("start-backup", move |event| {
// event.payload 是 serde_json::Value
if let Some(path) = event.payload().get("path") {
println!("开始备份路径:{}", path);
// 执行备份操作...
let _ = handle.emit("backup-status", "进行中");
}
});
Ok(())
})
.run(tauri::generate_context!())
.expect("error while running tauri application");
}
这种方式比通过命令(command)更灵活,适合不需要返回值的通知类调用。
3. 全局事件广播(多窗口通信)
如果应用有多个窗口(比如主窗口 + 设置窗口),Tauri 的事件系统天然支持全局广播。Rust 端使用 emit 会自动向所有窗口发送事件,如果只想向特定窗口发送,则需使用该窗口的 emit 方法。
示例:主窗口完成初始化后通知所有窗口
// Rust 端
app_handle.emit("app-ready", "ok").unwrap();
其他窗口监听同一个事件:
import { listen } from '@tauri-apps/api/event';
listen('app-ready', (event) => {
console.log('收到全局广播:应用已就绪');
});
如果只想发给某个特定窗口(例如通过窗口标签名):
use tauri::Manager;
let window = app_handle.get_window("settings").unwrap();
window.emit("config-changed", new_config).unwrap();
注意:
- 事件名称是字符串,建议用带前缀的命名(如
app:backup:start)避免命名冲突。 - 事件负载(payload)必须是可序列化的 JSON 值,Rust 端通常用
serde_json::Value或自定义实现了Serialize的结构体。 - 事件是“触发即忘”的,不提供返回值,适合单向通知;如果需要请求-响应模式,应选用 Tauri 的命令(command)+
invoke。
小结
Tauri 的事件系统像是一个轻量级的消息总线,让前端和后端能够轻松地双向通知,且天然支持多窗口广播。合理利用事件,可以让你的应用在保持安全隔离的前提下,实现实时、流畅的交互体验。