乐趣区

关于flutter:Dart-217-正式发布

文 / Michael Thomsen, Google Dart 团队产品经理,2022 年 5 月 12 日发表于 Dart 官网博客

随着 Flutter 3 在本次 I/O 大会的公布,咱们也同时正式公布了 Dart 2.17 稳定版 SDK。这个版本的公布是围绕着咱们的外围主题构建的,即:当先的生产力和平台可移植性。

Dart 2.17 提供了新的语言个性: 枚举反对成员变量、改良的超类参数继承,以及更为灵便的命名参数 。咱们同时为 package:lints 开启了 2.x 版本,这是一套官网的 lint 规定,是依据咱们总结的 Dart 最佳实际整合而成的一个 lint 规定集。与此同时,咱们也更新了外围库的 API 文档,为其带来了丰盛的示例代码。并且,为了改善平台集成个性,咱们在 Flutter 插件中提供了一个新的模版,应用 dart:ffi 与原生平台进行 C 语言的互操作、对 RISC-V 指令集提供实验性反对,以及对 macOS 和 Windows 可执行文件的签名反对。

编程语言新个性助力生产力晋升

咱们始终在继续地改良 Dart 编程语言,一直增加新个性以及改良现有的个性,以助力开发者们工作效率的晋升。Dart 2.17 减少了对枚举成员变量的反对,优化了在构造函数中应用命名参数的形式,并且开始应用继承超类的参数以缩小简短和反复的代码。

加强的反对成员变量的枚举

枚举非常适合示意一组离散的状态。例如,咱们能够将水形容为 enum Water {frozen, lukewarm, boiling}。但如果咱们想在 enum 上增加一些办法,例如,将每个状态转换为温度,并反对将 enum 转换为 String,该怎么办?或者咱们能够应用扩大办法来增加一个 waterToTemp() 办法,但咱们必须时刻留神它与 enum 的同步。对于 String 咱们心愿覆写 toString() 办法,但它不反对这么做。

在 Dart 2.17 中现已反对枚举类型的成员变量。这意味着咱们能够增加保留状态的字段、设置状态的构造函数、具备性能的办法,甚至覆写现有的办法。社区中许多开发者始终有这样的需要,这是咱们在 Dart 编程语言仓库的问题追踪中 投票排名第三的问题。

持续拿 Water 举例,咱们能够增加一个保留温度的 int 字段,并增加接管 int 的默认构造函数:

enum Water 
  const Water(this.tempInFahrenheit);

  final int tempInFahrenheit;
}

为了确保在创立枚举时构造函数被失常调用,咱们须要为每一个枚举值附以显式的调用:

enum Water {frozen(32),
  lukewarm(100),
  boiling(212);
}

想要反对从枚举转换为 String,咱们能够很简略地覆写 toString 办法,因为 enums 也继承自 Object

@override
String toString() => "The $name water is $tempInFahrenheit F.";

如此一来,你就有了一个能够轻松实例化残缺性能的枚举类,并且能够在任意地位调用办法:

void main() {print(Water.frozen); // 打印内容为“The frozen water is 32 F.”}

这两种办法的残缺示例如下所示,有了这些改变,新版本的代码更易于浏览和保护。

超类的初始化结构

当你的代码存在类型继承关系时,一个常见的做法是将一些构造函数参数传递给超类的构造函数。为此子类须要 1) 在其构造函数中列出每个参数 2) 应用这些参数调用超类的构造函数。这导致了大量的代码反复,使代码难以浏览和保护。

几位 Dart 社区成员帮忙 Dart 实现了这项语言指标。半年前,GitHub 用户 @roy-sianez 提交了一个 语言问题。他的倡议相似于 GitHub 用户 @apps-transround 先前的 倡议:兴许咱们能够通过引入一个新的形式来示意在超类中指定了一个参数,来解决这个问题。咱们认为这是一个好主见,因而已将其实现并增加到了 Dart 2.17 版本中。从以下示例中能够看出,这与 Flutter widget 的代码有很强的相关性。实际上当咱们将这项个性利用到 Flutter 框架时,咱们看到框架总共缩小了 近两千行代码!

可在任意参数地位应用命名参数

最初,咱们改良了办法调用时命名参数的形式。在此次更新之前,命名参数的调用必须呈现在一般参数列表的前面。当你想要晋升代码可读性,心愿将命名参数写在靠前的地位但它无奈工作时,会感觉十分惆怅。例如下方 List<T>.generate 构造函数的调用。此次更新之前 growable 参数必须放在最初,这会导致这个参数很容易被可能有很多内容的结构参数所影响而错过。当初你能够依据本人的爱好对它们进行排序,你能够先应用命名参数,最初应用生成器参数。

更多无关这三项改良的示例,请参阅咱们更新的 枚举、超类的初始化结构 和 命名参数 示例代码。

生产力工具改良

回到生产力的主题,咱们围绕生产力对外围工具进行了一些改良。

在 Dart 2.14 中,咱们引入了 package:lints,它与 Dart 分析器一起工作以避免你编写谬误的代码,并应用更标准的规定审查你的 Dart 代码。之后分析器中又新增了许多代码提醒规定,咱们对其进行了认真分类,并从中抉择了 10 条新的用于所有 Dart 代码的代码提醒规定,以及 2 条新的专门用于 Flutter 代码的代码提醒规定。它们包含确保你导入的 package 中有正确地在你 pubspec 文件中申明、避免滥用对类型参数的空查看以及确保子属性格局统一的代码提醒规定。你能够简略地应用命令降级到新的 lints package:

  • 对 Dart package 能够应用:
    dart pub upgrade —-major-versions lints
  • 对 Flutter package 能够应用:
    flutter pub upgrade —-major-versions flutter_lints

SecureSockets 通常用于启用应用 TLS 和 SSL 爱护的 TCP 套接字连贯。在 Dart 2.17 之前,因为没有方法查看平安数据流量,在开发过程中调试这些加密连贯变得非常辣手。当初咱们增加了对指定 keyLog 文件的反对,指定后,当与服务器替换新的 TLS 密钥时,NSS 密钥日志格局 中的一行文本将附加到文件中。这将使网络流量剖析工具 (例如 Wireshark) 可能解密通过套接字发送的内容。更多详细信息,请参阅 SecureSocket.connect() 的 API 文档。

dart doc 生成的 API 文档是大多数 Dart 开发者学习新 API 的重要内容之一。尽管咱们的外围库 API 长期以来都有丰盛的文本形容,但许多开发者通知咱们,他们更喜爱通过浏览示例代码来学习 API。在 Dart 2.17 中,咱们查看了所有次要的外围库,为浏览量排名的前 200 个页面增加了详实的示例代码。你能够比照 dart:convert 在 Dart 2.16 和 2.17 的文档页面查看这些扭转,心愿这些扭转能够帮忙你更好地应用 API 文档。

助力生产力的进步不仅是做加法,做减法也同样重要,咱们清理了一些沉积的内容,并删除了 SDK 里已弃用的的 API,这将帮忙咱们放弃更小的代码体积,这对新上手的开发者们尤为重要。为此,咱们从 dart:io 库中删除了 231 行已弃用的代码。如果你仍在应用这些已弃用的 API,你能够应用 dart fix 进行修复和替换。咱们还在持续致力删除 已弃用的 Dart CLI 工具,本次更新删除了 dartdoc 工具 (应用 dart doc 代替 ) 和 pub 工具 (应用 dart pubflutter pub 代替 )。

扩充平台集成和反对

第二个外围主题是平台集成和反对。Dart 是一种真正的多平台语言。尽管咱们曾经反对 大量的平台,但咱们仍在一直拓展新平台,以确保你能够与每个受反对的平台深度集成,同时也关注更新兴的平台。

咱们 与 C 语言或原生代码互操作 的外围机制——Dart FFI,是一种将 Dart 代码与现有原生平台代码集成的风行形式。在 Flutter 上,FFI 是构建应用宿主平台原生 API (例如 Windows win32 API) 插件的好办法。在 Dart 2.17 和 Flutter 3 中,咱们向 flutter 工具增加了 FFI 的模板,当初你能够轻松地创立 FFI 插件,这些插件具备通过 dart:ffi 调用原生代码反对的 Dart API。详细信息请参阅开发者文档 开发 package 和插件 页面。

FFI 当初反对特定于 ABI 的类型,能够在具备特定 ABI (应用程序二进制接口)”) 类型的平台上应用 FFI。例如,当初你能够应用 Long (C 语言中的 long) 正确示意具备特定于 ABI 大小的长整数,因为 CPU 架构的区别,后果可能是 32 位或 64 位。无关反对类型的残缺列表,请参阅 AbiSpecificInteger API 页面 中的 “Implementers” 列表。

在应用 Dart FFI 与原生平台深度集成时,有时须要将 Dart 调配的内存或其余资源 (端口、文件等) 的清理行为与原生代码对齐。长期以来,这个问题都非常辣手,因为 Dart 是一种会主动解决垃圾回收清理行为的语言。在 Dart 2.17 中,咱们通过引入 Finalizer 的概念解决了这个问题,它包含一个 Finalizable 标记接口,用于「标记」不应过早终结或抛弃的对象,以及一个 NativeFinalizer 能够附加到 Dart 对象上,当对象行将被垃圾回收时提供回调运行。Finalizer 让原生代码和 Dart 代码中同时运行清理。更多详细信息请参阅 NativeFinalizer API 文档 中的形容和示例,或 WeakReferences 以及 Finalizer 在 Dart 代码中的相似反对。

将 Dart 编译为本机代码的反对,也是使 Flutter 利用具备杰出的启动性能和疾速渲染的外围。除此之外,你还能够应用 dart compile 编译 Dart 文件为可执行文件。这些可执行文件能够在任何机器上独立运行,无需装置 Dart SDK。Dart 2.17 中的另一个新性能是反对对可执行文件进行签名,生成的产物能够在常常须要签名的 Windows 和 macOS 上进行部署。

咱们还放弃在新兴的平台前沿,持续扩充咱们所反对的平台集。RISC-V 是一个全新的指令集体系。RISC-V International 是一家全球性的非盈利组织,领有 RISC-V 标准,使得指令集自在凋谢。这依然是一个新兴的平台,但咱们对其后劲感到兴奋,因而咱们的 2.17.0–266.1.beta Linux 版本蕴含了对它的实验性反对。咱们心愿可能听到你的反馈,你能够 提出问题 或 分享 你的体验!

开始应用 Dart 2.17!

咱们心愿 Dart 的 2.17 正式版能感动你并能助力你进步工作效率,也同时可能把你的利用带去更多的平台。即刻下载 Dart 2.17 并开始应用,也装置应用 Flutter 3,应用内置的 Dart SDK。


原文链接 :

https://medium.com/dartlang/d…

本地化 : CFUG 团队

中文链接 : https://flutter.cn/posts/dart…

退出移动版