文/ Michael Thomsen, Google Dart 团队产品经理,2022 年 5 月 12 日发表于 Dart 官方博客
Flutter 3 在本次 I/O 大会的发布,我们也同时正式发布了 Dart 2.17 稳定版 SDK。这个版本的发布是围绕着我们的核心主题构建的,即:领先的生产力和平台可移植性。
枚举支持成员变量、改进的超类参数继承,以及更为灵活的命名参数。我们同时为 开启了 2.x 版本,这是一套官方的 lint 规则,是根据我们总结的 Dart 最佳实践整合而成的一个 lint 规则集。与此同时,我们也更新了核心库的 API 文档,为其带来了丰富的示例代码。并且,为了改善平台集成特性,我们在 Flutter 插件中提供了一个新的模版,使用 与原生平台进行 C 语言的互操作、对 RISC-V 指令集提供实验性支持,以及对 macOS 和 Windows 可执行文件的签名支持。
编程语言新特性助力生产力提升
增强的支持成员变量的枚举
枚举非常适合表示一组离散的状态。例如,我们可以将水描述为 。但如果我们想在 上添加一些方法,例如,将每个状态转换为温度,并支持将 转换为,该怎么办?或许我们可以使用扩展方法来添加一个 方法,但我们必须时刻注意它与 的同步。对于 我们希望覆写 方法,但它不支持这么做。
投票排名第三的问题。
enum Water
const Water(this.tempInFahrenheit;
final int tempInFahrenheit;
}
为了确保在创建枚举时构造函数被正常调用,我们需要为每一个枚举值附以显式的调用:
enum Water {
frozen(32,
lukewarm(100,
boiling(212;
}
想要支持从枚举转换为,我们可以很简单地覆写 方法,因为 也继承自 :
@override
String toString( => "The $name water is $tempInFahrenheit F.";
如此一来,你就有了一个可以轻松实例化完整功能的枚举类,并且可以在任意位置调用方法:
void main( {
print(Water.frozen; // 打印内容为 “The frozen water is 32 F.”
}
这两种方法的完整示例如下所示,有了这些改动,新版本的代码更易于阅读和维护。
超类的初始化构造
几位 Dart 社区成员帮助 Dart 实现了这项语言目标。半年前,GitHub 用户 @roy-sianez 提交了一个 语言问题。他的建议类似于 GitHub 用户 @apps-transround 先前的 建议:也许我们可以通过引入一个新的方式来表示在超类中指定了一个参数,来解决这个问题。我们认为这是一个好主意,因此已将其实现并添加到了 Dart 2.17 版本中。从以下示例中可以看出,这与 Flutter widget 的代码有很强的相关性。实际上当我们将这项特性应用到 Flutter 框架时,我们看到框架总共减少了 近两千行代码!
可在任意参数位置使用命名参数
枚举、超类的初始化构造 和 命名参数 示例代码。
生产力工具改进
在 Dart 2.14 中,我们引入了,它与 Dart 分析器一起工作以防止你编写错误的代码,并使用更规范的规则审查你的 Dart 代码。之后分析器中又新增了许多代码提示规则,我们对其进行了仔细分类,并从中选择了 10 条新的用于所有 Dart 代码的代码提示规则,以及 2 条新的专门用于 Flutter 代码的代码提示规则。它们包括确保你导入的 package 中有正确地在你 pubspec 文件中声明、防止滥用对类型参数的空检查以及确保子属性格式一致的代码提示规则。你可以简单地使用命令升级到新的 package:
对 Dart package 可以使用:
对 Flutter package 可以使用:
NSS 密钥日志格式 中的一行文本将附加到文件中。这将使网络流量分析工具 (例如 Wireshark 能够解密通过套接字发送的内容。更多详细信息,请参阅 的 API 文档。
Dart 2.16 和 2.17 的文档页面查看这些改变,希望这些改变可以帮助你更好地使用 API 文档。
231 行已弃用的代码。如果你仍在使用这些已弃用的 API,你可以使用 进行修复和替换。我们还在继续努力删除 已弃用的 Dart CLI 工具,本次更新删除了 工具 (使用 代替 和 工具 (使用 或 代替。
扩大平台集成和支持
大量的平台,但我们仍在不断拓展新平台,以确保你可以与每个受支持的平台深度集成,同时也关注更新兴的平台。
与 C 语言或原生代码互操作 的核心机制——Dart FFI,是一种将 Dart 代码与现有原生平台代码集成的流行方式。在 Flutter 上,FFI 是构建使用宿主平台原生 API (例如 Windows win32 API 插件的好方法。在 Dart 2.17 和 Flutter 3 中,我们向 工具添加了 FFI 的模板,现在你可以轻松地创建 FFI 插件,这些插件具有通过 调用原生代码支持的 Dart API。详细信息请参阅开发者文档 开发 package 和插件 页面。
ABI (应用程序二进制接口 类型的平台上使用 FFI。例如,现在你可以使用 (C 语言中的 正确表示具有特定于 ABI 大小的长整数,由于 CPU 架构的区别,结果可能是 32 位或 64 位。有关支持类型的完整列表,请参阅 AbiSpecificInteger API 页面 中的 "Implementers" 列表。
NativeFinalizer API 文档 中的描述和示例,或 WeakReferences 以及 Finalizer 在 Dart 代码中的类似支持。
我们还保持在新兴的平台前沿,继续扩大我们所支持的平台集。RISC-V 是一个全新的指令集体系。RISC-V International 是一家全球性的非盈利组织,拥有 RISC-V 规范,使得指令集自由开放。这仍然是一个新兴的平台,但我们对其潜力感到兴奋,因此我们的 Linux 版本包含了对它的实验性支持。我们希望能够听到你的反馈,你可以 提出问题 或 分享 你的体验!