原文链接 medium.com/dartlang/th…

在曩昔的四年里 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:
(doublex,doubley)getLocation(Stringname) {
if(name=='Aarhus') {
 return(56.1629,10.2039);
}else{
 ...
}
}
​
// Deconstructing the returned record back into individual variables:
voidmain(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:
sealedclassShape{
doublecalculateArea();
}
​
classSquareimplementsShape{
finaldoublelength;
Square(this.length);
doublecalculateArea()=>length*length;
}
​
classCircleimplementsShape{
finaldoubleradius;
...
}
​
doublecalculateArea(Shapeshape)=>switch(shape) {
Square(length:varl)=>l*l,
Circle(radius:varr)=>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 版,展示所有新功用,敬请期待~