You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中promiseToFuture调用后始终不返回的问题排查

问题分析与解决方案

你的问题出在Dart对JS Promise的包装识别问题:使用dart:js库的context.callMethod调用JS async函数时,返回的是JsObject类型的包装对象,而dart:js_util的promiseToFuture无法正确识别这个包装后的Promise,导致即使JS端的Promise已经resolve,Dart的await仍会无限阻塞。

解决方法

改用dart:js_util库的callMethod来调用全局JS函数,它会直接返回原生JS Promise对象,promiseToFuture可以正确处理。

修改后的Dart代码示例

import 'dart:html';
import 'dart:js_util' as js_util;

// ... 其他代码

final ScriptElement script = ScriptElement()
  ..async = true
  ..src = "assets/lib/myjscode.js";
querySelector('head')!.children.add(script);

await script.onLoad.first;

// 使用js_util的callMethod调用全局函数
var jsRes = js_util.callMethod(window, 'initJS', []);
// 此时promiseToFuture可以正确识别Promise并等待resolve
var pr = await js_util.promiseToFuture(jsRes); 

// 现在可以执行到这行
print("Complete: $pr"); // 输出 "Complete: test"

另一种兼容方案(保留dart:js调用)

如果一定要用dart:js的context,可以通过JsObject的raw属性获取原生JS对象,再传给promiseToFuture:

import 'dart:js' as js;
import 'dart:js_util' as js_util;

// ... 其他代码

var jsRes = js.context.callMethod('initJS');
// 提取原生JS Promise对象
var pr = await js_util.promiseToFuture(jsRes.raw); 

print("Complete: $pr");

验证说明

修改后,当JS端的setTimeout触发并resolve Promise时,Dart的await会立即解除阻塞,执行后续的print语句。

内容的提问来源于stack exchange,提问作者andynewman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 17:47:26