[译] Dart 3 发布了
原文 medium.com/dartlang/an…
ducafecat.com/blog/dart-3
来自 Google I/O 2023 的问候。今日,咱们在 Mountain View 现场宣告 Dart 3——迄今为止最大的 Dart 发布!Dart 3 包含三个首要进展。首先,咱们完成了通往 100% 无空安全的旅程。其次,咱们为记载、形式和类修饰符增加了严重的新言语特性。第三,咱们预览了未来,经过 Wasm 编译,咱们将扩展咱们的渠道支撑,为 web 供给本地代码支撑。现在,让咱们进入细节。
100% 无空安全
在曩昔的四年里,咱们将 Dart 开展成了一种快速、便携、现代化的言语。现在,经过 Dart 3,它是一种 100% 无空安全的言语!正如咱们之前所讨论的,咱们以为没有其他编程言语曾经为现有言语增加过无空安全。所以,这是一个相当漫长的旅程。
在 Dart 中完成了 100% 的 null 安全之后,咱们具有了 sound 类型体系。您能够信任,假如一个类型说一个值不是 null
,那么它永久不会是 null
。这避免了某些类别的编程过错,如空指针反常。它还允许咱们的编译器和运行时以不或许没有空安全的方法优化代码。这个规划选择涉及到一个折衷。虽然搬迁变得有点困难,但咱们以为咱们为 Dart 做出了正确的选择。
搬迁到 Dart 3
完成 sound null safety 的一个关键部分是 Dart 社区的不懈支撑:pub.dev 的前 1000 个包中有 99% 支撑 null safety!
鉴于此,咱们估计现已搬迁到 null safety 的绝大多数包和应用程序将与 Dart 3 兼容。只要在少量状况下,Dart 3 中的一些相关清理或许会影响一些代码。一些旧的中心库 API 现已被删除(#34233, #49529),一些东西现已进行了调整(#50707)。假如您在运用 Dart 3 SDK 搬迁时遇到任何问题,请参阅 Dart 3 搬迁攻略。除此之外,咱们期望您会喜爱新的理性化中心库和东西。
首要言语特性——记载、形式和类修饰符
Dart 3 不仅是改动现有言语的问题。它还增加了重要的新功用和能力!这些包含记载、形式和类修饰符。
运用记载构建结构化数据
传统上,Dart 函数只能回来单个值。因而需求回来多个值的函数有必要将它们打包到其他数据类型中,例如映射或列表,或界说能够保存值的新类。运用未打印的数据结构会削弱类型安全性。有必要界说新类以只是携带数据会在编码过程中增加冲突。您现已非常清楚地告知了咱们:多回来值的言语请求是咱们的 第四高评级问题。
运用记载,您能够运用美丽而简练的语法构建结构化数据。考虑这个函数。它读取 JSON 块的称号和年纪,并将它们都以记载方法回来:
(String, int) userInfo(Map<String, dynamic> json) {
return (json['name'] as String, json['height'] as int);
}
这应该很熟悉一切的 Dart 开发人员。记载看起来像列表文字,例如 [‘Michael’, ‘Product Manager’]
,但运用括号而不是方括号。在 Dart 中,记载是一个通用特性。它们能够用于超过函数回来值的用途。您还能够将它们存储在变量中,将它们放入列表中,在映射中运用它们作为键,或创建包含其他记载的记载。您能够增加未命名字段,就像咱们在先前的示例中所做的那样,也能够增加命名字段,如 (42, description: ‘Meaning of life’)
。
记载是值类型,没有身份。这使得编译器在某些状况下能够完全擦除记载目标。记载还带有主动界说的 ==
运算符和 hashCode
函数。记载文档中有更多细节。
运用形式和形式匹配处理结构化数据
记载简化了构建结构化数据的方法。这并不取代运用类构建更正式的类型层次结构。它只是供给了另一种选择。在任何状况下,您或许需求将该结构化数据分解为其各个元素以处理它们。这就是形式匹配发挥作用的地方。
考虑形式的基本方法。以下记载形式将记载分解为两个新变量 name
和 height
。然后,这些变量能够像任何其他变量相同运用,例如在调用 print
中:
var (String name, int height) = userInfo({'name': 'Michael', 'height': 180});
print('User $name is $height cm tall.');
相似的形式存在于列表和映射中。关于一切这些,您能够运用下划线形式跳过单个元素:
var (String name, _) = userInfo(…);
当在 switch 句子中运用时,形式会发挥作用。Dart 从一开端就具有有限的 switch 支撑。在 Dart 3 中,咱们扩展了 switch
句子的功用和表达力。咱们现在支撑在这些状况下进行形式匹配。咱们现已删除了在每个 case 结尾增加 break
的需求。咱们还支撑逻辑运算符来组合 case。以下示例显示了一个美丽而简练的 switch
句子,该句子解析字符代码:
switch (charCode) {
case slash when nextCharCode == slash:
skipComment();
case slash || star || plus || minus:
operator(charCode);
case >= digit0 && <= digit9:
number();
default:
invalid();
}
当需求每个 case
中有一个或多个句子时,switch
句子供给了很好的帮助。在某些状况下,您只需求核算一个值。关于这种用例,咱们供给了一个非常简练的 switch expression。这相似于 switch statement,但运用不同的语法,这些语法被调整为表达式。以下示例函数回来 switch 表达式的值,以核算今日的作业日描述:
String describeDate(DateTime dt) =>
switch (dt.weekday) {
1 => 'Feeling the Monday blues?',
6 || 7 => 'Enjoy the weekend!',
_ => 'Hang in there.'
};
形式的一个强壮功用是检查“穷尽性”,该功用保证 switch 处理一切或许的状况。在上一个示例中,咱们处理了 weekday 的一切或许值,它是一个 int
。经过为特定值 1
、6
或 7
的匹配句子组合,然后运用默认状况 _
处理剩下的状况,咱们穷尽了一切或许的值。为了对用户界说的数据层次结构(例如,类层次结构)启用此检查,请在类层次结构的顶部运用新的 sealed
修饰符,如以下示例:
sealed class Animal { … }
class Cow extends Animal { … }
class Sheep extends Animal { … }
class Pig extends Animal { … }
String whatDoesItSay(Animal a) =>
switch (a) { Cow c => '$c says moo', Sheep s => '$s says baa' };
这将回来以下过错,提醒咱们漏掉了最终一个或许的子类型,Pig:
line 6 • The type 'Animal' is not exhaustively matched by the switch cases
since it doesn't match 'Pig()'.
最终,if
句子也能够运用形式。鄙人一个示例中,咱们运用 if-case 匹配来匹配一个 map-pattern 来解构 JSON 映射。在其中,咱们针对常量值(如 'name'
和 'Michael'
)和类型测试形式 int h
进行匹配以读取 JSON 值。假如形式匹配失利,Dart 将履行 else
句子。
final json = {'name': 'Michael', 'height': 180};
// Find Michael's height.
if (json case {'name': 'Michael', 'height': int h}) {
print('Michael is $h cm tall.');
} else {
print('Error: json contains no height info for Michael!');
}
这只涉及到您能够运用形式的一切内容。咱们信任它们将在一切 Dart 代码中变得普遍。要了解更多,请检查 形式文档 和 形式 codelab。
类修饰符为类供给细粒度的拜访操控
Dart 3 的第三个言语特性是类修饰符。与咱们期望每个 Dart 开发人员都运用的记载和形式不同,这更像是一个高档用户功用。它解决了 Dart 开发人员构建大型 API 外表或构建企业级应用程序的需求。
类修饰符使 API 作者能够仅支撑特定的功用集。默认值坚持不变。咱们期望 Dart 坚持简略和易于挨近。因而,像以前相同,常规类能够 结构、扩展 和 完成,如以下示例所示:
class Vehicle {
String make; String model;
void moveForward(int meters) { … }
}
// Construct.
var myCar = Vehicle(make: 'Ford', model: 'T',);
// Extend.
class Car extends Vehicle {
int passengers;
}
// Implement.
class MockVehicle implements Vehicle {
@override void moveForward …
}
类修饰符支撑增加限制。考虑一些示例用例:
- 运用
interface class
,您能够界说其他人要完成的协议。接口类无法扩展。 - 运用
base class
,您能够保证您的一切类的子类型都从它承继,而不是完成其接口。这保证了一切实例上都能够运用私有办法。 - 运用
final class
,您能够封闭类型层次结构,防止在您自己的库之外创建任何子类。作为示例的优点是,这允许 API 具有者增加新成员而不会冒着破坏 API 顾客的风险。
有关具体信息,请参见新的class modifiers documentation。
展望未来
Dart 3 不仅是一个新功用的重要前进,咱们还为您供给了未来的预览。
Dart 言语
记载、形式和类修饰符是非常重要的新功用,因而它们的规划或许仍有改善之处。咱们将持续监控您的反馈定见,假如需求,在 Dart 3 后的小版别中进行更新。
咱们还在研讨一些更小、更增量的功用,这些功用完全不会破坏任何代码,并且专注于进步开发者的生产力。咱们正在探索的两个比如是内联类,用于运用零本钱“包装器”封装现有类型,以及主结构函数; 这是一项功用,它引入了一个更简练的语法,用于界说具有少量字段和主结构函数的类。
咱们之前讨论过宏(也称为元编程)。咱们特别重视此功用,以完成更好的 JSON 反序列化(及相似操作),以及完成数据类。鉴于元编程的规模和固有风险,咱们采取了非常完全的办法,因而没有具体时间表可共享,乃至无法最终确定规划决策。
原生互操作
移动设备和桌面应用程序通常依赖于由本地渠道供给的许多 API,无论是告诉、支付还是获取手机位置。传统上,在 Flutter 中经过构建插件来拜访这些 API,这需求编写 Dart 代码和一堆特定于渠道的代码来供给完成。
咱们现已支撑运用[dart:ffi](<https://dart.dev/guides/libraries/c-interop>)
编译为 C 库的代码进行互操作。咱们目前正在扩展此功用,以支撑在 Android 上的Java 和 Kotlin 互操作,以及在 iOS/macOS 上的Objective C 和 Swift 互操作。要了解 Android 互操作的介绍,请检查 Google I/O 23 的新Android 互操作视频。
编译为 WebAssembly —— 运用本机代码定向 Web
WebAssembly(缩写为 Wasm)作为跨现代浏览器的渠道中立二进制指令格局而不断老练。Flutter 框架现已运用 Wasm 一段时间了。这是咱们经过一个 Wasm 编译模块将用 C++ 编写的 SKIA 图形渲染引擎传递到浏览器中的方法。咱们长期以来一向有兴趣将 Wasm 用于部署 Dart 代码,但咱们一向受阻。像许多其他面向目标言语相同,Dart 运用垃圾收回。在曩昔的一年里,咱们与 Wasm 生态体系中的几个团队合作,为 WebAssembly 标准增加了一个新的 WasmGC 功用。这在 Chromium 和 Firefox 浏览器中现已挨近安稳。
咱们将 Dart 编译为 Wasm 模块的作业关于 Web 应用程序有两个高层次的目标:
- 加载时间:咱们期望能够经过 Wasm 供给部署负载,使浏览器能够更快地加载,从而进步用户与 Web 应用程序交互所需的时间。
- 功用:由 JavaScript 驱动的 Web 应用程序需求即时编译才干完成良好的功用。Wasm 模块更挨近底层和机器代码,因而咱们以为它们能够供给更高的功用,削减卡顿并供给更共同的帧速率。
- 语义共同性:Dart 自豪地表明在咱们支撑的渠道之间高度共同。然而,在 Web 上,这还存在一些例外状况。例如,Dart Web 当时在数字的表明方法上有所不同。运用 Wasm 模块,咱们将能够将 Web 视为相似其他本机目标的渠道,其语义相似。
咱们很高兴地宣告 Dart 到 Wasm 编译的第一个预览版!咱们开始的重点是 Flutter Web 支撑。现在还处于前期阶段,咱们还有很多作业要完成,但咱们邀请您进行试验,看看这是否和咱们相同令人兴奋。
结束语
感谢您阅读到最终。咱们期望这篇文章让您对 Dart 3 感到兴奋,它今日在独立的Dart SDK和Flutter 3.10 SDK中都能够运用。
咱们经过声响的空值安全、中心库和东西清理完成了 Dart 言语的严重改造。有严重的新言语功用,使 Dart 更具表现力和清晰度,具有记载和形式。关于大型 API 外表,类修饰符能够完成具体的操控。咱们还包含了未来的预览,即咱们行将支撑 WebAssembly。
凭仗一切这些功用,咱们以为 Dart 3 展现了咱们的长期愿景:树立最具生产力的编程言语,用于在任何渠道上构建快速应用程序。咱们期望您也这样以为!
猫哥 ducafecat.com
end
本文由mdnice多渠道发布