如何通过Dart js_interop实现Tauri v2与Flutter Web集成并调用API?
解决Flutter Web通过Dart js_interop调用Tauri v2 invoke方法的问题
你的错误核心在于Tauri的invoke方法返回的是异步Promise,而非同步字符串,你之前的interop定义错误地将返回值声明为JSString,导致类型不匹配。
正确的JS Interop定义
import 'dart:js_interop'; import 'dart:js_util'; // 用于处理参数转JS对象 @JS('window.__TAURI__.core.invoke') external JSPromise<JSString> invoke(JSString command, [JSObject? args]);
调用示例(异步处理)
因为invoke返回Promise,必须用async/await处理异步逻辑:
Future<String> callTauriCmd(String command, [Map<String, dynamic>? args]) async { // 可选:将Dart参数Map转为JS对象 final jsArgs = args != null ? jsify(args) as JSObject : null; // 调用invoke并解析Promise结果 final jsResult = await invoke(command.toJS, jsArgs).toDart; // 将JS字符串转为Dart字符串 return jsResult.toDart; }
额外注意事项
- 确认Tauri配置
tauri.conf.json中已启用全局Tauri对象:
{ "tauri": { "windows": [ { "webview": { "withGlobalTauri": true } } ] } }
- 若Tauri命令返回非字符串类型,需调整泛型适配:
- 返回JSON对象:使用
JSPromise<JSObject>,后续用dartify转为Dart Map - 返回数字:使用
JSPromise<JSNumber>,转为Dart int/double类型
- 返回JSON对象:使用
内容的提问来源于stack exchange,提问作者Ramon Rivas
相关产品推荐
相关产品推荐

