Dart 3.2 更新盘点
作者 / Kevin Moore 和 Michael Thomsen
咱们盛大宣告推出 Dart 3.2,这一版别针对以下方面做出了改善: 新增了一项言语功用,可对私有 final 字段进行非空晋级;经过新增的互操作功用改善了开发者体会;支撑 DevTools 的扩展程序;并更新了咱们的 Web 路线图,包括供给对 Wasm (又叫 WebAssembly) 的支撑。
私有 final 字段的非空晋级
自咱们在 Dart 2.12 中引进 健全的空安全 (sound null safety) 以来已曩昔几年时刻。您能够凭借空安全声明哪些类型可为空 (能够包括值或 null),哪些类型不可为空 (一直包括值)。经过将空安全与 流程剖析 相结合,能够检测何时能够将可为空的变量 "晋级" 为更安全的非空类型:
int definitelyInt(int? aNullableInt) {
if (aNullableInt == null) {
return 0;
}
// If flow analysis reaches this point,
// aNullableInt can safely promote to a non-null int.
return aNullableInt;
}
自 Dart 2.12 发布以来,类型晋级一直是空安全的中心部分,但仅限于局部变量。字段或尖端变量无法晋级,例如以下代码示例:
class Container {
final int? _fillLevel;
Container(this._fillLevel);
check() {
if (_fillLevel != null) {
int i = _fillLevel; // Prior to Dart 3.2, causes an error.
}
}
}
这种局限性由多种杂乱的状况导致。在这些状况中,流程剖析无法安全地确认字段何时或怎么改变。以类上的字段晋级为例,假如子类运用 getter 掩盖字段,可能会存在问题,由于有时会回来 null。
在 Dart 3.2 中,咱们改善了流程剖析引擎,现在能够对私有 final 字段施行类型晋级。现在,上面的代码示例能够正常运转。您能够这样了解: 关于私有 final 字段,它的值在初始分配后永不更改,因而仅检查一次也是安全的。私有 final 字段晋级从 Dart 3.2 起推出,并将运用于装备 3.2 及以上版别 Dart SDK 的项目。
在 package:lints 3.0 中参加新的代码剖析选项
针对代码剖析,咱们还对 package:lints 中的规范代码剖析规矩进行了一些改善。此 package 包括默许和引荐的静态剖析规矩集,适用于任何依据 dart create 或 flutter create (经过 package:flutter_lints — package:lints 的扩展) 创立的新项目。
此 lint 集新的首要版别 (版别 3.0) 现已推出。咱们在此修订版的中心会集增加了六个 lint,在引荐会集增加了两个 lint,可用于验证 pubspec URL,以及验证是否运用正确的参数调用调集办法等。您能够检查 更新日志 获取完好的更改列表。3.0 版别将成为行将发布的新项目的默许版别。您也能够 当即晋级 现有项目。
Dart 互操作性更新
供给 广泛的跨渠道支撑 一直是 Dart 的中心准则。可是,即便一行 Dart 代码能够做到无需更改就能在一切渠道上运转,大型运用一般依然需求与现有代码进行互操作。现有代码指旧项目的代码,或其他库中可用的 API 或体系 API。咱们在这一范畴投入了很多精力,首先是用于 与原生 C API 进行互操作 的 FFI。咱们现在正在尽力扩展该范畴,以支撑与 Java、Kotlin、Objective C 和 Swift 的互操作。您能够阅览下文 Dart Web 部分,了解有关 JS 互操作性的精彩更新。
从 Dart 3.2 开端,咱们对原生互操作进行了许多改善:
-
咱们为 C FFI 引进了 NativeCallable.isolateLocal 结构函数,它能够依据恣意 Dart 函数创立 C 函数指针。这是一项由 Pointer.fromFunction 供给的扩展功用,只能依据尖端函数创立函数指针。
-
咱们更新了 Objective-C 绑定生成器,以运用在 Dart 3.1 中增加的 NativeCallable.listener。该生成器现在能够主动处理包括异步回调的 API,例如 Core Motion 这类此前需求手动编写部分绑定代码的 API。
-
咱们为完成 Java 和 Kotlin 互操作而继续改善 package:jnigen。现在能够将 package:cronet_http (适用于 Android 的 Cronet HTTP 客户端的封装容器) 从手写的绑定代码迁移到 主动生成的封装容器。
-
咱们在 Native Assets 功用方面取得了重大进展,该功用旨在处理与依靠原生代码的 Dart package 分发相关的许多问题。Native Assets 供给一致的钩子来集成构建 Flutter 和独立 Dart 运用所触及的各种构建体系,然后处理相关问题。您能够检查相关 文档 获取预览。
适用于 Dart package 的 DevTools 扩展程序
Dart DevTools 是一套用于支撑纯 Dart 和 Flutter 运用的调试及功用东西。咱们在 Dart 3.2 和 Flutter 3.16 中 推出 了新的 扩展结构,让 package 作者能够直接在 DevTools 中为其 package 构建自定义东西。因而,包括结构的 pub.dev package 能够供给特定于其用例的自定义东西。例如,Serverpod 的作者一直在尽力为其 package 构建 DevTools,而且很快乐在行将发布的 1.2 版别 中供给 DevTools 扩展程序。
△ 方案归入行将发布的 ServerPod 1.2 版别中的 DevTools 扩展程序
Dart Web 和 Wasm 更新
Wasm (也称为 WebAssembly) 是一种在 Web 浏览器上十分棒的新指令格局,还供给可移植、独立于渠道的二进制格局,以适用于现代浏览器。咱们正在将高档保管言语 (如 Dart) 的废物收回功用增加到 Wasm 规范中。从 Chrome 119 开端默许启用 Wasm 的废物收回支撑 (也称为 Wasm-GC)。下一个安稳版别 Firefox 120 也将支撑 Wasm-GC。那么 Dart、Flutter 和 Wasm-GC 现在是什么状况呢?
Dart-to-Wasm 编译器简直装备一切功用。咱们对功用和兼容性十分满足,正在进一步重视边际状况,以保证在各种场景中完成痛快运转。
关于 Flutter Web,咱们完成了一个新的 "Skwasm" 烘托引擎开发。为了最大极限进步功用,Skwasm 经过 wasm-to-wasm 绑定,将编译后的运用代码直接连接到自定义 CanvasKit Wasm 模块。这是 Flutter Web 多线程烘托支撑的初次迭代,进一步进步了帧时刻。
在选用 Wasm 的 Flutter Web 预备完毕现在的试验状况之前,咱们还有一些工作要做:
- 两层编译 : 生成 Wasm 和 JavaScript 输出,并在运转时启用功用检测,以支撑具有或不具有 Wasm-GC 支撑的浏览器。
- 现代 JavaScript 互操作性 : 一种新的根据 扩展类型 的 JS 互操作机制,当针对 JavaScript 和 Wasm 时,能够在 Dart 代码、浏览器 API 和 JS 库之间完成简练的、类型安全的调用。
- 支撑 Wasm 的浏览器 API : 新的 package:web,根据现代 JS 互操作机制,替代了 dart:html (及相关库),借此可轻松拜访浏览器 API,而且支撑在 JS 和 Wasm 目标上运用。
咱们正在开端将很多的内部项目迁移到 package:web 和新的 JS 互操作机制,并期望鄙人一个安稳版别中向您供给更多更新。与此同时,您能够在咱们的 WebAssembly 支撑 页面上获取最新的详细信息。
开端体会
以上便是咱们要与您共享的一切内容。Dart 3.2 现已在 dart.dev 中推出,您也能够经过咱们将在后续介绍的 Flutter 3.16 版别运用此产品。纵情体会新版 Dart 吧!