在过去的四年里 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 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 版,展示所有新功能,敬请期待~
作者:恋猫de小郭
链接:https://juejin.cn/post/7174985128799076389