参考原文:medium.com/dartlang/da…

本次跟随 Flutter 3.16 发布 的 Dart 3.2 ,包括有:私有 final 字段的非空改善、新的 interop 改善、对 DevTools 中的扩展支撑、以及对 Web 道路图的更新,包括对 Wasm 的Web 组件支撑。

最重要的便是 Wasm 的Web 组件支撑。

private final 的非空类型进步

自 Dart 2.12 发布 sound null safety 以来,类型进步一直是空安全的核心部分之一,但仅限于局部变量里,字段和尖端变量无法处理,例如在这样的状况下会报错:

class Container {
  final int? _fillLevel;
  Container(this._fillLevel);
  check() {
    if (_fillLevel != null) {
      int i = _fillLevel; // Prior to Dart 3.2, causes an error.
    }
  }
}

这种限制是由于几个复杂的状况形成的,在这些状况下,flow analysis 无法确认字段何时会产生什么改变,例如,在字段进步的状况下,假如子类运用 getter 掩盖字段(有时会返回 null),这就可能会出现问题。

在 Dart 3.2 开端,Dart 改善了 flow analysis ,现在能够归类出 private Final fields

现在 3.2 里上面的代码片段能够顺利经过检测:关于 private & final 的字段,它的值在初始分配后永久不会改变,因而仅检查一次就被认为是安全的。

包中的新代码剖析选项:lints 3.0

3.2 还对 package:lints 中的标准代码剖析规矩进行了一些改善,package 包括了默许和推荐的静态剖析规矩集,这些规矩随 dart createflutter create 创立的新项目一同供给 (经过 package:flutter_lints )。

该 lint 集的首要版别(3.0)现在现已发布,其间向核心集添加了 6 个 lint,向推荐集添加了 2 个 lint,它具有用于验证 pubspec URL、验证是否运用正确参数调用集合方法等相关的 lints 。

有关更改的完好列表,请检查 github.com/dart-lang/l…, 3.0 版别将成为即将发布的新项目的默许版别。

Dart interop 更新

现在正在尽力扩展 Dart interop 以全面支撑与 Java 和 KotlinObjective C 和 Swift 的直接调用支撑,从 Dart 3.2 开端进行了许多改善:

  • 引入了 C FFI 的构造函数 NativeCallable.isolateLocal ,它能够从任意 Dart 函数创立一个 C 函数指针,这是 Pointer.fromFunction 供给的功用的扩展,它只能从尖端函数创立函数指针。

  • 更新了 Objective-C 利用NativeCallable.listener 绑定生成器,生成器现在能够自动处理包括异步回调的 API,例如 Core Motion 这种曾经需求手动绑定的代码。

  • 改善 package:jnigen 完成 Java 和 Kotlin 的直接调用支撑,现在我们能够将 package:cronet_httpAndroid Cronet HTTP 客户端的包装器)从手写绑定代码迁移到自动生成的包装器。

  • Native Assets 功用上取得了重大进展,该功用旨在解决与依靠于 Native 代码的 Dart 包分发相关的许多问题,它经过供给统一的钩子来与构建 Flutter 和独立 Dart 应用所涉及的各种构建需求,具体可见 :dart.dev/guides/libr…

    Native Assets 现在是一个试验性的功用,它能够让 Dart 包更无缝依靠和运用 Native 代码,经过 flutter run/flutter build dart run/dart build 构建并绑缚 Native 代码 。

    备注:可经过 flutter config --enable-native-assetsflutter create --template=package_ffi [package name] 启用。

    Dart 3.2 更新,Flutter Web 的未来越来越明亮

    Demo native_add_library 展现了相关运用,当 Flutter 项目依靠 package:native_add_library 时, 脚本会自动在 build.dart 命令上调用:

    import 'package:native_add_library/native_add_library.dart';
    void main() {
      print('Invoking a native function to calculate 1 + 2.');
      final result = add(1, 2);
      print('Invocation success: 1 + 2 = $result.');
    }
    

Dart 包的 DevTools 扩展

在 Dart 3.2 和 Flutter 3.16 中发布了一个新的扩展结构,该结构让包作者能够为它的 package 构建自定义东西,并直接在 DevTools 中显现。

它答应包括结构的 pub.dev 包供给特定用例的自定义东西,例如 Serverpod 的作者一直在尽力为它的 package 构建开发人员东西,并且很快乐在即将发布的 1.2 版别 中供给 DevTools 扩展。

Dart 3.2 更新,Flutter Web 的未来越来越明亮

Dart Web 和 Wasm 更新

从 Chrome 119 开端,Chrome 会默许启用 Wasm 垃圾搜集支撑(称为 Wasm-GC) ,Wasm-GC 支撑也出现在 Firefox 120(他们的下一个安稳版别)中被支撑,那么 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 interop:一种根据扩展类型的新 JS 互操作机制,当针对 JavaScript 和 Wasm 时,能够在 Dart 代码、浏览器 API 和 JS 库之间进行简练、类型安全的调用。
  • 支撑 Wasm 的浏览器 API:一个新的 package:web,根据现代 JS 互操作机制,取代了 dart:html (和相关库),这将供给对浏览器 API 的更轻松访问,并支撑 JS 和 Wasm 目标。

现在现已开端将一些内部项目迁移到 package:web 和新的 JS 互操作机制,并希望在下一个安稳版别中有更多更新。

能够在 flutter.dev/wasm 了解更多。

最终

本次更新最重要有两个点,榜首便是 Dart interop 越来越老练,相信以后直接经过 flutter run 就能够完成一切 interop 的绑定和编译,第二便是 Web 道路随着 Dart Wasm 支撑的进展,越来越值得期待了。