Flutter 的下一步, Dart3 即将在 2023 到来

时间:2022-12-10 11:52:20

原文链接 https://medium.com/dartlang/the-road-to-dart-3-afdd580fbefa

在过去的四年里 Dart 已经发展成为一门高效、可移植的现代化语言,而下一个版本 Dart 3 将达到可靠的 null 安全语言的最后一步。

作为 null safety 的最后一步,本次将删除几个历史 Dart 和 SDK artifacts,包括删除对 running without sound null safety 的支持

如今许多现代编程语言都支持 null safety ,比如 Swift、C# 和 Kotlin 等语言,可以在其中将变量声明为非空永远不能保持空值)或可为(可以保存一个值或 null)的情况,这些类型系统会和静态分析结合使用,以检测将 null 赋值给不可为 null 的变量。

同样,Dart 语言中的 null 安全支持默认情况下使变量不可为 null,并且仅在显式声明时才允许 null。

在 Dart 3 中,所有 Dart 代码都将使用健全的空安全

自从 Dart 2.12 引入空安全到现在已经三年了,在此期间开发者可以在没有 null safety 的情况下运行,也可以在具有部分 null safety 的混合模式下运行,也可以在具有完全健全的 null safety 的情况下运行。

当 100% 的代码(包括所有依赖项)已迁移到 null safety 时,就会出现完全可靠的空安全支持,在此期间 Dart 开发人员有时间一步一步地迁移现有代码,但是支持多种模式会增加开销和复杂性。

首先,Dart 开发人员需要了解以上三种模式,每当阅读一段 Dart 代码时,就必须检查语言版本以查看类型是否默认为非空、默认可为空或它们的某种组合。

其次,在我们的编译器和运行时支持所有三种模式会减慢 Dart SDK 的发展速度,这种支持增加了添加新功能的成本和复杂性

从在 Dart 3 开始,正如之前 2.18 里提前宣布的那样,sound null safety 将是唯一受支持的模式,**小于 2.12 的 SDK 约束的 Pubspec 文件将在 Dart 3 及更高版本中停止解析。

当开发者将依赖约束设置为小于 2.12(例如// @dart=2.9)时,任何包含语言标记的源代码都将失效。

根据目前的观测,我们相信此时大约 85% 的 flutter run 执行都使用了声音空安全,如果你还在剩余的 15% 中,那请在 Dart 3 发布之前迁移,预计在 2023 年年中左右

Breaking 和 API 更改

除了 null 安全更改之外,Dart 3 还进行了一些其他更改,以删除 Dart 和核心库 API 中的一些历史 artifacts,这些更改包括:

  • 删除已停用的核心库 API ( #49529 )
  • 删除默认参数值的历史语法 ( #2357 )
  • 要求明确的 tear-offs ( ##2399 )。

这些更改对迁移到使用 null 安全的代码的影响很小,当第一个 Dart 3 alpha 版本发布时,开发者可以快速测试这些较小的 Breaking。

Dart 3 的新特性和功能

Dart 3 也有望包含许多新功能,包括改进与其他编程语言的交互能力和新的语言特性, 这部分内容将在2023 年 1 月 25 日的 Flutter Forward 中详细讨论。

例如有被称为 patterns 的语言特性,patterns 让 Dart 语言更具表现力,增加了对更多结构化数据的支持,并使用代数数据类型实现了更实用的风格。

以下代码显示了在一个函数上使用多个返回值的示例,以及将这些返回值解构为单个变量的能力:

// A function which returns a record -- in this case a pair of two doubles:
(double x, double y) getLocation(String name) {
  if (name == 'Aarhus') {
    return (56.1629, 10.2039);
  } else {
    ...
  }
}

// Deconstructing the returned record back into individual variables:
void main(List<String> arguments) {
  final (lat, long) = getLocation('Aarhus');
  print('Current location: $lat, $long');
}

// You can also define a hierarchy of classes, and then pattern match on those:
sealed class Shape {
  double calculateArea();
}

class Square implements Shape {
  final double length;
  Square(this.length);
  double calculateArea() => length * length;
}

class Circle implements Shape {
  final double radius;
  ...
}

double calculateArea(Shape shape) => switch (shape) {
  Square(length: var l) => l * l,
  Circle(radius: var r) => math.pi * r * r
};

Beyond Dart 3

目前除了 Dart 3 还有大量并行的潜在的新功能在处理,首先,正如去年提到的, Dart 团队正在努力支持将 Dart 代码编译为 WebAssembly ( Wasm ),Wasm 能让 Flutter Web 在浏览器中作为完整的原生代码运行。

这是一项艰巨的任务,除了更新 Dart 编译器之外还需要很多额外的工作。它需要与 W3C 和浏览器供应商合作,通过 WasmGC 扩展在 Wasm 中添加对垃圾收集语言的支持。

其次 Dart 团队正在研究 macros 启用静态元编程,这种强大的机制允许一段代码(宏)在程序编译期间修改和扩展程序的源代码,例如可以减少反序列化 JSON 或创建数据类所需的样板文件

Dart 3 发布路线

接下来,Dart 3 将在一系列里程碑中陆续推出,目前的期望围绕这些日期

  • 2023 年 1 月/2 月左右:Dart 3 alpha 发布,它将专注于启用早期的 Dart 3 兼容性测试,目标是让大家能够运行静态分析 ( dart analyze/ flutter analyze),理论上通过 Dart 3 alpha 静态分析的应用或包都可以支持 Dart 3 稳定版。
  • 2023 年 3 月/4 月左右:Dart 3 测试版发布,此版本预览了 Dart 3 中的新功能,开发者可以使用它来试验新功能并就问题或改进建议提供反馈。
  • 2023 年年中左右:Dart 3 稳定版发布,健全的空安全将成为唯一支持的模式。

总结

Dart 3 版本计划于 2023 年年中左右发布,它将包含几项重大更改,其中主要是在没有健全的空安全的情况下你的代码将停止运行,计划在 2023 年 1 月或 2 月左右准备好 Dart 3 alpha 版本,可以将其用于 Dart 3 兼容性测试

在此期间你可以准备:

  • 完成任何未完成的空安全迁移
  • 验证代码未使用任何已弃用的 API
  • 运行 dart fix

Dart 3 还将包含几个新的强大功能,例如 patterns ,计划是希望在春季发布 Dart 3 beta 版,展示所有新功能,敬请期待~