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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 11:46:01