如何在Tauri(前端为SvelteKit)中实现后端变量传递至前端?
问题分析与修复方案
你的代码编译失败的核心原因是emit_all的调用方式错误,以下是具体问题和修复方法:
错误点梳理
- 参数类型不匹配:
tauri::command::emit_all的第一个参数需要的是&AppHandle(应用实例句柄),但你传入的是tauri::Window::current()(窗口实例),类型不兼容导致编译报错。 - 不必要的
Some包裹:emit_all的第三个参数接受任意实现Serialize的类型,json!()返回的serde_json::Value已经满足要求,不需要用Some包裹。
正确代码示例
场景1:在WebSocket回调中广播事件(需持有AppHandle引用)
如果是在WebSocket的处理逻辑中,你需要提前获取并持有AppHandle实例(比如在Tauri的setup函数中传递):
use tauri::{AppHandle, Manager}; use serde_json::json; // 假设这是WebSocket收到数据后的处理函数 fn handle_websocket_data(app_handle: &AppHandle, request: String) { // 向所有窗口广播事件 app_handle.emit_all("request", json!({ "request": request })) .expect("Failed to send request to frontend"); }
场景2:在Tauri命令中广播事件
如果是在自定义的Tauri命令中,直接通过参数获取AppHandle:
use tauri::{AppHandle, command}; use serde_json::json; #[command] pub fn broadcast_websocket_data(app_handle: AppHandle, request: String) { app_handle.emit_all("request", json!({ "request": request })) .expect("Failed to send request to frontend"); }
场景3:仅向当前窗口发送事件
如果你不需要广播到所有窗口,只想给当前窗口发事件,可以用Window实例的emit方法:
use tauri::{Window, command}; use serde_json::json; #[command] pub fn send_to_current_window(window: Window, request: String) { window.emit("request", json!({ "request": request })) .expect("Failed to send request to frontend"); }
前端监听补充(确认逻辑)
你提到前端已配置监听,这里给出SvelteKit中标准的监听方式供参考:
<script> import { onMount } from 'svelte'; import { listen } from '@tauri-apps/api/event'; onMount(async () => { // 监听后端发送的"request"事件 const unsubscribe = await listen('request', (event) => { // 拿到数据后处理展示逻辑 console.log('收到后端数据:', event.payload); }); // 组件销毁时取消监听 return unsubscribe; }); </script>
内容的提问来源于stack exchange,提问作者Dorian
相关产品推荐
相关产品推荐

