1 详解Google Dart 2.17版本的新语言特性-德赢Vwin官网 网
0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

详解Google Dart 2.17版本的新语言特性

谷歌开发者 来源:谷歌开发者 作者:Flutter 2022-05-27 10:44 次阅读

作者 / Michael Thomsen, Product Manager working on Dart and Flutter

我们在 Google I/O 大会上发布了全新的 2.17 版 Dart SDK。此版本构建于我们的核心主题之上,即领先的工作效率与平台可移植性。Dart 2.17 带来了新的语言特性,包括在枚举中支持成员变量、改进超类参数继承及提高命名参数的灵活性等。我们推出全新的主要版本 package:lints 来帮助大家根据最佳实践检查 Dart 代码。同时,我们还大幅更新了核心库的 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 中现已全面支持枚举成员变量。因此,我们可以添加保存状态的字段、设置状态的构造函数、具备功能的方法,甚至重写现有方法。许多开发者对此功能一直有需求,这是我们语言问题跟踪专页中投票排名第三的问题:

再次以水为例,我们可以添加一个保存温度的 int 字段,并添加一个接收 int 的默认构造函数:

enum Water { final int tempInFahrenheit; const Water(this.tempInFahrenheit);}

为了确保在创建 enum 时构造函数被调用,我们需要为每一个 enum 值进行调用:
enum Water { frozen(32), lukewarm(100), boiling(212);}

要支持转换为 String,我们只需重写 enums 继承自 ObjecttoString 方法:
@overrideString toString() => "The $name water is $tempInFahrenheit F.";

这样即可获得一个可以轻松实例化的完整 enum,您可以在其上调用方法:
void main() { print(Water.frozen); // Prints “The frozen water is 32 F.”}

以下为这两种方法的完整示例。不难看出,全新 Dart 2.17 版本的代码更加易于阅读和维护。

e0e3aa9e-dd5d-11ec-ba43-dac502259ad0.png

超类初始化构造

如果您的代码存在类继承层次结构,常见模式是将一些构造函数参数传递给超类的构造函数。为此,子类需要 1) 在其构造函数中列出每个参数;2) 使用这些参数调用超类的构造函数。这样会导致样板代码反复出现,从而增加代码的阅读和维护难度。 在几位 Dart 社区成员的帮助下,我们的改进目标得以实现。半年前,GitHub 用户 @roy-sianez 提交了一个相关的语言问题。他的建议与 GitHub 用户 @apps-transround 之前提出的建议类似:也许我们可以这样解决问题,即引入新的构造方式,来表示超类中已指定一个参数。我们认为这个想法不错,所以将其添加在 Dart 2.17 中。从下面的示例中不难看出,这尤其与 Flutter widget 代码密切相关。实际上,在我们将这项新特性应用到 Flutter 框架后,代码总共减少了近两千行

e0eabe92-dd5d-11ec-ba43-dac502259ad0.png

在任意参数位置使用命名参数最后,我们改进了调用某个方法时命名参数的使用方式。此前,命名参数只能出现在方法参数列表的最后。如果您希望让位置参数靠后,从而提升代码可读性,这种限制就会令人感到非常烦恼。以下面 List.generate 构造函数的调用为例:之前,growable 参数必须放在最后,因为它位于含生成器的大型位置参数之后,很容易在阅读时被错过。而现在,您可以根据喜好排列参数,先放置小型命名参数,最后再放置带生成器的参数。

e105f7de-dd5d-11ec-ba43-dac502259ad0.png

更多有关这三个特性的示例,请参阅我们更新的枚举超类初始化构造命名参数示例代码。

工作效率工具

在工作效率主题方面,我们对核心工具进行了一些改进。

在 Dart 2.14 中,我们引入了 package:lints,它可与 Dart 分析器一起工作,以帮助您避免编写出包含错误的 Dart 代码,并通过规范化的方式提升代码审核效率。后来分析器中又新增了许多 Lint,我们对其进行了仔细分类,并从中选择了 10 条新的 Lint 用于所有 Dart 代码,还有 2 条新的 Lint 专门用于 Flutter 代码。其中一些 Lint 可确保 pubspec 文件中包含导入内容,防止滥用类型参数空检查,以及保证子属性格式一致。您可以通过简单的命令升级到新的 Lint:

  • 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 2.16Dart 2.17 中 dart:convert 的文档页面,希望这些更新有助于您更轻松地使用 API 文档。

为平台新增功能可以提升工作效率,清理堆积的既有问题,并删除弃用的功能同样也可以。这样做有助于保持精简的使用体验,对新上手的开发者而言,这一点尤为重要。为此,我们从 dart:io 库中删除了 231 行已弃用的代码。如果您仍在使用这些已弃用的 API,可以使用 dart fix 进行修复和替换。我们还在继续努力删除已弃用的 Dart CLI 工具,此外,本次更新删除了 dartdoc 工具 (使用 dart doc 代替) 和 pub 工具 (使用 dart pubflutter pub 代替)。

扩大平台集成与支持

平台集成与支持是我们的第二个核心主题。Dart 是一种真正的多平台语言。尽管我们现已支持大量平台,但仍在不断拓展演进,确保您可以与每个受支持的平台深度集成,同时也支持新出现的平台。

Dart FFI 是我们与 C 语言或原生代码互操作的核心机制,广泛用于将 Dart 代码与现有原生平台代码集成。在 Flutter 上,Dart FFI 也是构建使用托管平台原生 API (例如 Windows win32 API) 的插件的理想方法。在 Dart 2.17 和 Flutter 3 中,我们为 flutter 工具添加了模板,现在您可以轻松地创建 FFI 插件,这些插件的 Dart API 通过 dart:ffi 调用原生代码。详细信息请参阅官方文档中的 "开发 package 和插件":

为支持在具有 ABI (应用程序二进制接口) 特有类型的平台上使用 FFI,FFI 现已支持 ABI 特有类型。例如,现在您可以使用 Long (C 语言中的 long) 正确表示 ABI 特有大小的长整数,由于 CPU 架构的区别,结果可能是 32 位或 64 位。有关支持类型的完整列表,请参阅 AbiSpecificInteger API 页面中的 "Implementers" 列表。

在使用 Dart FFI 与原生平台深度集成时,有时开发者需要调整适配 Dart 代码和原生代码的内存或其他资源 (端口、文件等) 的清理行为。长期以来,这个问题都十分棘手,因为 Dart 是一种会自动处理清理行为的垃圾回收语言。在 Dart 2.17 中,我们通过引入 Finalizer 的概念,解决了这个问题。Finalizer 中包括一个 Finalizable 标记接口,用于 "标记" 不应过早终结或丢弃的对象,以及一个可以附加到 Dart 对象的 NativeFinalizer 类,在对象即将被垃圾回收时提供回调运行。这样,在原生代码和 Dart 代码中都可以运行清理代码。更多详细信息,请参阅 NativeFinalizer API 文档,或参阅 WeakReferenceFinalizer 文档中的描述和示例,以了解常规 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 版本 (以后可能进入我们的 beta 渠道) 中已经为其提供了实验性的支持。我们希望能够获得您的反馈,请大家不吝提出问题分享使用体验

即刻使用 Dart 2.17!

我们希望 Dart 2.17 版本能打动您,并能助力您提高工作效率,把您的应用带去更多平台。您可以即刻下载 Dart 2.17 并开始使用,或者使用 Flutter 3 SDK 中包含的 Dart SDK。
原文标题:一起看 I/O | Dart 2.17 现已发布: 工作效率与平台集成

文章出处:【微信公众号:谷歌开发者】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Google
    +关注

    关注

    5

    文章

    1762

    浏览量

    57504
  • SDK
    SDK
    +关注

    关注

    3

    文章

    1035

    浏览量

    45897
  • Dart
    +关注

    关注

    0

    文章

    9

    浏览量

    1748
收藏 人收藏

    评论

    相关推荐

    三、四、六、八缸发动机NVH特性详解

    三、四、六、八缸发动机NVH特性详解。  
    的头像 发表于 11-16 11:45 224次阅读
    三、四、六、八缸发动机NVH<b class='flag-5'>特性</b><b class='flag-5'>详解</b>

    Google AI Edge Torch的特性详解

    我们很高兴地发布 Google AI Edge Torch,可将 PyTorch 编写的模型直接转换成 TFLite 格式 (.tflite),且有着优异的模型覆盖率和 CPU 性能。TFLite
    的头像 发表于 11-06 10:48 353次阅读
    <b class='flag-5'>Google</b> AI Edge Torch的<b class='flag-5'>特性</b><b class='flag-5'>详解</b>

    浅谈Xpedition 2409版本的新功能

    在《创新不止|Xpedition 2409版本新功能揭秘(上)》一文中,我们了解了Xpedition 2409版本的部分改进部分。今天,我们继续看Xpedition 2409新版本给我们带来了什么样的全新用户体验。
    的头像 发表于 10-31 15:33 679次阅读

    Vivado 2024.1版本的新特性(2)

    从综合角度看,Vivado 2024.1对SystemVerilog和VHDL-2019的一些特性开始支持。先看SystemVerilog。
    的头像 发表于 09-18 10:34 853次阅读
    Vivado 2024.1<b class='flag-5'>版本</b>的新<b class='flag-5'>特性</b>(2)

    Vivado 2024.1版本的新特性(1)

    Vivado 2024.1已正式发布,今天我们就来看看新版本带来了哪些新特性
    的头像 发表于 09-18 10:30 1285次阅读
    Vivado 2024.1<b class='flag-5'>版本</b>的新<b class='flag-5'>特性</b>(1)

    USB4 2.0版本的重大更新

    USB版本一直很多,可以说是五花八门,但是随着接口的日渐统一,USB的版本可以说减少了很多,到了USB4,只剩下USB-C接口,为何还有一个2.0版本,我们往下详解
    的头像 发表于 09-09 14:37 597次阅读

    【AWTK最新动态】AWTK 1.8版本发布

    AWTK是一套基于C语言开发的跨平台GUI框架,目前正式推出1.8版本。本次更新不仅对许多细节进行了优化,还增添了众多重要特性和文档资料。此外,还引入了三款创新控件和两个与AWTK相关项目。AWTK
    的头像 发表于 08-30 12:48 427次阅读
    【AWTK最新动态】AWTK 1.8<b class='flag-5'>版本</b>发布

    ENV-Windows v2.0.0版本发布

    ENV-Windows v2.0.0版本发布
    的头像 发表于 06-26 08:35 731次阅读
    ENV-Windows v2.0.0<b class='flag-5'>版本</b>发布

    chrome插件新版本(v3版本)中的热更新,即加载更新远程js的方法探索

    使用。 或者要翻墙到google应用商店提交审核,才能热更新。    2 当前问题 1、由于安全策略逐步增强,越来越不支持热更新了,之前可以直接调用远程资源的方法均被禁止了; 2、chrome插件开发中,v2版本是支持热更新的,但明年v2
    的头像 发表于 06-14 10:19 803次阅读
    chrome插件新<b class='flag-5'>版本</b>(v3<b class='flag-5'>版本</b>)中的热更新,即加载更新远程js的方法探索

    STM32的4.0版本的电机库是如何实现OOP编程的?

    STM32的4.0版本的电机库是如何实现OOP编程的 看4.0的电机库,看到使用的OOP编程思想,但是C语言本身好像是不支持继承、虚函数等技术的 那电机库里是怎么实现的,有好的相关学习资料吗?
    发表于 05-17 06:50

    LwIP v2.0版本更换为v2.1.2版本后接收不到数据了怎么解决?

    请教下,吧 LwIP v2.0 版本更换为 v2.1.2 版本后接收不到数据了,是怎么回事啊 ?? 之前使用 v2.0 版本测试是完全可以了,不过目前 使用 v2.1.2版本的,dhc
    发表于 04-23 08:20

    苹果停iOS 16.7.6验证,仅支持16.7.7版本验证

    据悉,苹果已于4月17日停止了对iOS 16.7.6版本的验证服务。对于已升级至iOS 16.7.7版本的iPhone用户来说,他们已无法返回至旧版系统。
    的头像 发表于 04-17 10:27 1116次阅读

    SAP HANA 2.0 SP07版本新功能特性汇总

    的HANA 2.0 SP06版本建议今年下半年尽快升级到HANA 2.0 SP07版本。那么HANA 2.0 SP07新版本有哪些功能特性变化呢? HANA
    的头像 发表于 02-19 09:22 512次阅读

    PSOC Creator由3.3版本升级到4.1版本后,程序的EEEPROM模块无法使用怎么解决?

    PSOC Creator由3.3版本升级到4.1版本后,程序的EEEPROM模块无法使用,请提供一下CY8C4247读写内部Flash的例程,谢谢 。
    发表于 02-01 06:58

    Vivado 2023.2版本的新增功能

    Vivado在前一段时间更新了2023.2版本,经过一段时间的使用这个版本还是很丝滑的,用起来挺舒服。
    的头像 发表于 01-02 09:39 3199次阅读
    Vivado 2023.2<b class='flag-5'>版本</b>的新增功能