毕业论文
您现在的位置: 框架 >> 框架资源 >> 正文 >> 正文

Dart217正式发布

来源:框架 时间:2024/9/23

文/MichaelThomsen,GoogleDart团队产品经理,年5月12日发表于Dart官方博客

随着Flutter3在本次I/O大会的发布,我们也同时正式发布了Dart2.17稳定版SDK。这个版本的发布是围绕着我们的核心主题构建的,即:领先的生产力和平台可移植性。

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

编程语言新特性助力生产力提升

我们一直在持续地改进Dart编程语言,不断添加新特性以及改进现有的特性,以助力开发者们工作效率的提升。Dart2.17增加了对枚举成员变量的支持,优化了在构造函数中使用命名参数的方式,并且开始使用继承超类的参数以减少冗长和重复的代码。

增强的支持成员变量的枚举

枚举非常适合表示一组离散的状态。例如,我们可以将水描述为enumWater{frozen,lukewarm,boiling}。但如果我们想在enum上添加一些方法,例如,将每个状态转换为温度,并支持将enum转换为String,该怎么办?或许我们可以使用扩展方法来添加一个waterToTemp()方法,但我们必须时刻注意它与enum的同步。对于String我们希望覆写toString()方法,但它不支持这么做。

在Dart2.17中现已支持枚举类型的成员变量。这意味着我们可以添加保存状态的字段、设置状态的构造函数、具有功能的方法,甚至覆写现有的方法。社区中许多开发者一直有这样的需求,这是我们在Dart编程语言仓库的问题追踪中投票排名第三的问题[1]。

继续拿Water举例,我们可以添加一个保存温度的int字段,并添加接收int的默认构造函数:

enumWaterconstWater(this.tempInFahrenheit);finalinttempInFahrenheit;}

为了确保在创建枚举时构造函数被正常调用,我们需要为每一个枚举值附以显式的调用:

enumWater{frozen(32),lukewarm(),boiling();}

想要支持从枚举转换为String,我们可以很简单地覆写toString方法,因为enums也继承自Object:

overrideStringtoString()="The$namewateris$tempInFahrenheitF.";

如此一来,你就有了一个可以轻松实例化完整功能的枚举类,并且可以在任意位置调用方法:

voidmain(){print(Water.frozen);//打印内容为“Thefrozenwateris32F.”}

这两种方法的完整示例如下所示,有了这些改动,新版本的代码更易于阅读和维护。

超类的初始化构造

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

几位Dart社区成员帮助Dart实现了这项语言目标。半年前,GitHub用户

roy-sianez[2]提交了一个语言问题[3]。他的建议类似于GitHub用户

apps-transround[4]先前的建议[5]:也许我们可以通过引入一个新的方式来表示在超类中指定了一个参数,来解决这个问题。我们认为这是一个好主意,因此已将其实现并添加到了Dart2.17版本中。从以下示例中可以看出,这与Flutterwidget的代码有很强的相关性。实际上当我们将这项特性应用到Flutter框架时,我们看到框架总共减少了近两千行代码[6]!

可在任意参数位置使用命名参数

最后,我们改进了方法调用时命名参数的方式。在此次更新之前,命名参数的调用必须出现在普通参数列表的后面。当你想要提升代码可读性,希望将命名参数写在靠前的位置但它无法工作时,会觉得非常惆怅。例如下方ListT.generate构造函数的调用。此次更新之前growable参数必须放在最后,这会导致这个参数很容易被可能有很多内容的构造参数所影响而错过。现在你可以根据自己的喜好对它们进行排序,你可以先使用命名参数,最后使用生成器参数。

更多有关这三项改进的示例,请参阅我们更新的枚举[7]、超类的初始化构造[8]和命名参数[9]示例代码。

生产力工具改进

回到生产力的主题,我们围绕生产力对核心工具进行了一些改进。

在Dart2.14中,我们引入了package:lints,它与Dart分析器一起工作以防止你编写错误的代码,并使用更规范的规则审查你的Dart代码。之后分析器中又新增了许多代码提示规则,我们对其进行了仔细分类,并从中选择了10条新的用于所有Dart代码的代码提示规则[10],以及2条新的专门用于Flutter代码的代码提示规则[11]。它们包括确保你导入的package中有正确地在你pubspec文件中声明、防止滥用对类型参数的空检查以及确保子属性格式一致的代码提示规则。你可以简单地使用命令升级到新的lintspackage:

对Dartpackage可以使用:dartpubupgrade—-major-versionslints对Flutterpackage可以使用:flutterpubupgrade—-major-versionsflutter_lints

SecureSockets通常用于启用使用TLS和SSL保护的TCP套接字连接。在Dart2.17之前,因为没有办法检查安全数据流量,在开发过程中调试这些加密连接变得十分棘手。现在我们添加了对指定keyLog文件的支持,指定后,当与服务器交换新的TLS密钥时,NSS密钥日志格式[12]中的一行文本将附加到文件中。这将使网络流量分析工具(例如Wireshark[13])能够解密通过套接字发送的内容。更多详细信息,请参阅SecureSocket.connect()的API文档[14]。

dartdoc生成的API文档是大多数Dart开发者学习新API的重要内容之一。虽然我们的核心库API长期以来都有丰富的文本描述,但许多开发者告诉我们,他们更喜欢通过阅读示例代码来学习API。在Dart2.17中,我们检查了所有主要的核心库,为浏览量排名的前个页面添加了详实的示例代码。你可以对比dart:convert在Dart2.16[15]和2.17[16]的文档页面查看这些改变,希望这些改变可以帮助你更好地使用API文档。

助力生产力的提高不仅是做加法,做减法也同样重要,我们清理了一些堆积的内容,并删除了SDK里已弃用的的API,这将帮助我们保持更小的代码体积,这对新上手的开发者们尤为重要。为此,我们从dart:io库中删除了行已弃用的代码[17]。如果你仍在使用这些已弃用的API,你可以使用dartfix进行修复和替换。我们还在继续努力删除已弃用的DartCLI工具[18],本次更新删除了dartdoc工具(使用dartdoc代替)和pub工具(使用dartpub或flutterpub代替)。

扩大平台集成和支持

第二个核心主题是平台集成和支持。Dart是一种真正的多平台语言。虽然我们已经支持大量的平台[19],但我们仍在不断拓展新平台,以确保你可以与每个受支持的平台深度集成,同时也

转载请注明:http://www.0431gb208.com/sjslczl/7856.html

  • 上一篇文章:
  • 下一篇文章: 没有了