dart:js 库
此库为与 JavaScript 交互提供低级别的支持。
注意
您通常应使用 dart:js_interop
而不是此库。了解更多信息,请查看 JS 互操作文档。
此库允许 Dart 代码从 Dart 获取和设置 JavaScript 对象的属性,并调用 JavaScript 对象的方法和调用 JavaScript 函数。当可能时,该库会负责在 Dart 与 JavaScript 对象之间进行转换,或者提供代理对象。
此库无法使 Dart 对象在 JavaScript 中可用,其方法和属性无法访问,尽管它允许将 Dart 函数传递到 JavaScript 中并从 JavaScript 中调用它。
JsObject 是核心类型,表示一个 JavaScript 对象的代理。JsObject 提供了对底层 JavaScript 对象属性和方法访问。可以通过调用 JavaScript 或从代理到 JavaScript 构造函数创建 JsObject。
顶级获取器 context 提供一个 JsObject,表示 JavaScript 中的全局对象,通常是 window
。
以下示例通过调用全局函数 alert()
的 JavaScript 调用显示一个警告对话框
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。
函数和闭包被代理,以便它们可以调用。分配给 JavaScript 属性的 Dart 闭包由 JavaScript 中的函数代理。从 Dart 访问的 JavaScript 函数由 JsFunction 代理,它有一个 JsFunction.apply 方法来调用它。
以下类型是直接转移并且没有代理的
- 基本类型:
null
、bool
、num
、String
、DateTime
TypedData
,包括其子类如Int32List
,但 不是ByteBuffer
- 在 Web 编译时,还包括:
Blob
、Event
、ImageData
、KeyRange
、Node
和Window
.
使用 JsObject.jsify() 转换集合
要从 Dart 集合创建 JavaScript 集合,请使用 JsObject.jsify 构造函数,该构造函数将 Dart Map 和 Iterable 转换为 JavaScript 对象和数组。
以下表达式创建了一个具有属性 a
和 b
定义的新 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 对象的代理。
属性
函数
-
allowInterop<
F extends Function> (F f) - 将函数
f
封装成JavaScript调用时,使用package:js
JavaScript互操作功能的包装器。 -
allowInteropCaptureThis(
Function f) - 将函数
f
封装成JavaScript调用时,使用package:js
JavaScript互操作功能,并将JavaScript的this
作为第一个参数传递。