dart:js 在调用 promiseToFuture 时出错 - NoSuchMethodError: 试图调用一个非函数,例如 null: 'jsPromise.then'

sro*_*oes 6 dart-js-interop flutter flutter-web

我正在尝试等待自定义的全局 JavaScript 函数:

  var promise = js.context.callMethod('performAuthenticationInNewWindow', [uri.toString()]);
  print(promise);
  var qs = await promiseToFuture(promise);
Run Code Online (Sandbox Code Playgroud)

打印以下内容:

[object Promise]
NoSuchMethodError: tried to call a non-function, such as null: 'jsPromise.then'
Run Code Online (Sandbox Code Playgroud)

Mab*_*ten 5

我遇到了同样的错误。鉴于dart:js_util包含函数 promiseToFuture() 的包的名称,我也认为该函数应该与通过 获得的对象一起使用dart:js,但事实并非如此,文档中的示例实际上非常清楚。

必须使用能够得到的JavaScript无极对象@JS()的注释package:js。例子:

@JS()
library my_lib; //Not avoid the library annotation

import 'dart:js_util';
import 'package:js/js.dart';

@JS()
external performAuthenticationInNewWindow(String uri);

performAuth(uri) async {
   var promise = performAuthenticationInNewWindow(uri.toString());
   var qs = await promiseToFuture(promise);
   print(qs);
}

Run Code Online (Sandbox Code Playgroud)

避免出错的注意事项:

如果用于与 Javascript 互操作的函数需要使用dart:js包获得的对象,则声明的类型通常是 not ObjectbutJsObject或 subclasses。相反,如果必须使用@JS注解获取对象,则声明的类型为Object,如果不存在适当的外部声明(使用@JS注解获取的对象的runtimeType为NativeJavaScriptObject,但在飞镖SDK)。