📡 invoke 命令

前端通过 invoke 调用 Rust 命令:

Rust 定义命令

rust
// src-tauri/src/lib.rs
#[tauri::command]
fn greet(name: &str) -> String {
    format!("Hello, {}!", name)
}

#[tauri::command]
async fn fetch_data(url: String) -> Result {
    // 异步操作
    Ok("data".to_string())
}

// 注册命令
fn main() {
    tauri::Builder::default()
        .invoke_handler(tauri::generate_handler![greet, fetch_data])
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}

前端调用

typescript
import { invoke } from '@tauri-apps/api/core';

// 同步调用
const greeting = await invoke('greet', { name: 'World' });
console.log(greeting); // "Hello, World!"

// 异步调用
try {
  const data = await invoke('fetch_data', { url: 'https://api.example.com' });
  console.log(data);
} catch (error) {
  console.error(error);
}

📨 事件系统

双向事件通信,支持广播和定向发送。

前端监听事件

typescript
import { listen } from '@tauri-apps/api/event';

// 监听事件
const unlisten = await listen('my-event', (event) => {
  console.log('Received:', event.payload);
});

// 取消监听
unlisten();

Rust 发送事件

rust
use tauri::Manager;

#[tauri::command]
fn send_event(app: tauri::AppHandle) {
    // 广播到所有窗口
    app.emit("my-event", "Hello from Rust").unwrap();
    
    // 发送到特定窗口
    app.get_webview_window("main")
        .unwrap()
        .emit("my-event", "Hello").unwrap();
}

前端发送事件

typescript
import { emit } from '@tauri-apps/api/event';

// 发送事件
await emit('my-event', { data: 'from frontend' });

📊 状态管理

在 Rust 端管理应用状态,跨命令共享。

rust
use std::sync::Mutex;
use tauri::State;

struct AppState {
    counter: Mutex,
}

#[tauri::command]
fn increment(state: State) -> i32 {
    let mut counter = state.counter.lock().unwrap();
    *counter += 1;
    *counter
}

fn main() {
    tauri::Builder::default()
        .manage(AppState {
            counter: Mutex::new(0),
        })
        .invoke_handler(tauri::generate_handler![increment])
        .run(tauri::generate_context!())
        .expect("error");
}

🔄 数据类型

IPC 支持的数据类型:

RustJavaScript
String, &strstring
i32, i64, f64number
boolboolean
Vec<T>Array
HashMap<K, V>Object
Option<T>T | null
Result<T, E>Promise