dart:js

低级支持与 JavaScript 互操作。

注意

通常应使用 dart:js_interop 而不是此库。要了解更多信息,请查看 JS 互操作文档

此库提供了从 Dart 访问 JavaScript 对象的接口,允许 Dart 代码获取和设置属性,并调用 JavaScript 对象的方法和执行 JavaScript 函数。在可能的情况下,库会处理 Dart 和 JavaScript 对象之间的转换,或者提供代理以实现转换。

此库不会使 Dart 对象在 JavaScript 中可用,它们的方法和属性不可访问,尽管它允许将 Dart 函数传递到 JavaScript 中并从 JavaScript 中调用。

JsObject 是核心类型,代表 JavaScript 对象的代理。JsObject 提供了对底层 JavaScript 对象属性和方法的访问。可以通过对 JavaScript 的调用或从 JavaScript 构造函数的代理创建 JsObject

顶级获取器 context 提供了一个代表 JavaScript 中全局对象的 JsObject,通常是 window

以下示例通过调用全局函数 alert() 显示一个警告对话框

import 'dart:js';

main() => context.callMethod('alert', ['Hello from Dart!']);

以下示例演示如何从 JavaScript 构造函数创建一个 JsObject 并访问其属性

import 'dart:js';

main() {
  var object = JsObject(context['Object']);
  object['greeting'] = 'Hello';
  object['greet'] = (name) => "${object['greeting']} $name";
  var message = object.callMethod('greet', ['JavaScript']);
  context['console'].callMethod('log', [message]);
}

代理和自动转换

在设置 JsObject 的属性或将参数传递给 JavaScript 方法或函数时,Dart 对象会自动转换为 JavaScript 对象或通过代理。在访问 JavaScript 属性或从 JavaScript 调用 Dart 闭包时,JavaScript 对象也会转换为 Dart。

函数和闭包通过代理方式,使得它们可调用。将 Dart 闭包分配给 JavaScript 属性时,会通过 JavaScript 中的函数进行代理。从 Dart 访问的 JavaScript 函数会通过 JsFunction 进行代理,该代理有一个 JsFunction.apply 方法来调用它。

以下类型会直接传输而不会进行代理

  • 基本类型:nullboolnumStringDateTime
  • TypedData,包括其子类如 Int32List,但 不包括 ByteBuffer
  • 在为网络编译时,还包括:BlobEventImageDataKeyRangeNodeWindow

使用 JsObject.jsify() 转换集合

要从 Dart 集合创建 JavaScript 集合,请使用 JsObject.jsify 构造函数,该构造函数将 Dart MapIterable 转换为 JavaScript 对象和数组。

以下表达式创建了一个具有属性 ab 定义的新 JavaScript 对象

var jsMap = JsObject.jsify({'a': 1, 'b': 2});

以下表达式创建了一个 JavaScript 数组

var jsArray = JsObject.jsify([1, 2, 3]);

JsArray<E>
一个代理 JavaScript 数组的 List
JsFunction
JavaScript 函数对象的代理。
JsObject
JavaScript 对象的代理。

属性

上下文 JsObject
JavaScript全局对象,通常为window
无setter

函数

allowInterop<F extends Function>(F f) → F
返回一个包装函数f,可以通过package:js JavaScript互操作从JavaScript中调用。
allowInteropCaptureThis(Function f) Function
返回一个包装函数f,可以通过package:js JavaScript互操作从JavaScript中调用,并将JavaScript this作为第一个参数传递。