Flutter Web调用检测隐身模式JS函数返回Promise对象的处理方法
Flutter Web处理detectIncognito返回的JS Promise对象
你调用detectIncognito得到JSObject ([object Promise])是因为该JS函数返回的是异步Promise对象,Flutter直接调用无法拿到resolved后的最终结果,需要做异步转换处理,以下是两种可行方案:
方案一:使用dart:js_util转换Promise为Dart Future
通过dart:js_util库的promiseToFuture方法,将JS Promise转为Dart可处理的Future,用await获取结果:
import 'dart:js'; import 'dart:js_util' as js_util; // 在异步函数中调用 Future<void> checkIncognitoMode() async { var jsPromise = js.context.callMethod('detectIncognito'); // 将JS Promise转为Dart Future var result = await js_util.promiseToFuture(jsPromise); // 解析结果 bool isPrivate = result['isPrivate']; String browserName = result['browserName']; // 后续业务逻辑 print('隐身模式状态: $isPrivate, 浏览器: $browserName'); }
方案二:修改JS代码,改用回调函数方式
调整JS函数,添加回调参数,在Promise resolve后触发回调传递结果:
// 完整的detectIncognito函数(需补全原有浏览器检测逻辑) function detectIncognito(callback) { new Promise(function(resolve, reject) { var browserName = "Unknown"; // 这里补全原detectIncognito中的浏览器检测逻辑,最终调用__callback function __callback(isPrivate) { resolve({ isPrivate: isPrivate, browserName: browserName, }); } // 示例:假设已完成检测,调用__callback(实际需替换为真实检测逻辑) // __callback(true); }).then(function(result) { // 触发回调传递结果 callback(result.isPrivate, result.browserName); }); }
然后在Flutter中通过allowInterop传递Dart回调函数:
import 'dart:js'; void checkIncognitoMode() { js.context.callMethod('detectIncognito', [ allowInterop((bool isPrivate, String browserName) { // 处理回调结果 print('隐身模式状态: $isPrivate, 浏览器: $browserName'); }) ]); }
注意:确保你使用的是完整的
detectIncognito.js代码,原示例仅展示了部分结构,需补全所有浏览器检测逻辑才能正常触发Promise的resolve。
内容的提问来源于stack exchange,提问作者Sunil Gupta
相关产品推荐
相关产品推荐

