Dart 3.4 今天发布!此版本展示了 Dart 和 Flutter 共同在 Flutter 3.22 / Dart 3.4 / IO24 文章中的努力,因此请确保在那里获取全部信息。本文介绍了我们对 WebAssembly 的支持,然后详细介绍了今年 Dart 语言的一个主要路线图项目:macro。

发布 Dart 3.4

dart 3.4

前言

原文

https://ducafecat.com/blog/dart-3-4

https://medium.com/dartlang/dart-3-4-bd8d23b4462a

Dart 3.4 今天发布!此版本展示了 Dart 和 Flutter 共同在 Flutter 3.22 / Dart 3.4 / IO24 文章中的努力,因此请确保在那里获取全部信息。本文介绍了我们对 WebAssembly 的支持,然后详细介绍了今年 Dart 语言的一个主要路线图项目:macro。

WebAssembly 更新

今天,我们很高兴地宣布,最新的 Flutter 3.22 稳定版本为 Flutter Web 应用程序提供了完整的 WebAssembly(Wasm)支持!

这是跨越 Dart 和 Flutter 的多年投资。如果您一直在关注这些发展,您会看到我们的增量发展:

  • 标准化 WasmGC 提案,
  • 添加全新的 Dart 编译器后端以生成 WasmGC 代码,和
  • 升级我们的 Web 和 JavaScript 互操作性功能,以最好地支持 Wasm。

我们将继续投资于 WebAssembly。我们的下一个努力将实现纯 Dart 应用程序对 Wasm 的全面支持,并完成一些缺失的功能(例如延迟加载)。Dart 中用于 Wasm 编译的端到端工具仍在开发中,但您可以通过一些临时步骤在稳定版中尝试预览。稍后,我们还希望支持 Dart 在 JS 环境之外的 Wasm,例如标准的 Wasm 运行时,如 wasmtime 和 wasmer。

Dart macro:提高开发抽象级别

我们投入了多年的时间来设计 Dart macro系统。为了改善 Dart 的开发体验,macro提供了一种元编程解决方案,就像代码生成一样。这个解决方案内置在 Dart 语言中,为开发人员提供最大的性能、效率和生产力。现在,我们准备提供这种体验的预览!

Dart 开发人员长期以来的一个痛点是序列化和反序列化 JSON 数据这种微不足道但又繁琐的模式。在 Dart 中,为了性能原因,它不支持运行时反射,因此要构建一个可重用且足够强大的解决方案是一个挑战。作为替代方案,我们依赖于代码生成解决方案,比如 JsonSerializable 。这些解决方案依赖于在代码本身之前运行的外部工具,使开发体验变得复杂。

今天,我们宣布了一个关于 JSON 序列化和反序列化的全新方法的预览: JsonCodable macro。

macro是一种通过在编译时内省其他代码生成更多代码的代码类型。例如,这里有一个应用了新的 JsonCodable macro的 Dart 类 Vehicle:

@JsonCodable()
class Vehicle {
  final String description;
  final int wheels;
  Vehicle(this.description, this.wheels);
}
void main() {
  final jsonString = Vehicle('bicycle', 2).toJson();
  print('Vehicle serialized: $jsonString');
}

那么,它是如何工作的? toJson() 方法(以及伴随的 fromJson() 构造函数)是从哪里来的?这是我们设计的一个旨在简化开发者体验的新macro系统的实验性实现。当 Dart 编译器看到 @JsonCodable() 注解时,它立即实时定位 JsonCodable macro的定义并开始执行。这会导致macro:

  1. 创建一个新的“增强类”;一种新的语言构造,可以向现有类添加新的声明。
  2. 阅读开发者对 Vehicle 类的定义,以确定它有两个字段, descriptionwheels
  3. 向增强类添加一个新的 toJson 方法签名。
  4. 填写 toJson 方法的主体,以处理描述和车轮字段的序列化。

所有这一切都是在没有延迟的情况下发生的。集成体验支持我们现有的开发人员工作流程,例如热重载,正如这个演示所示:

img

屏幕录像展示了使用macro的体验:最初不存在 toJson 代码补全,但在将 @JsonCodable 添加到类之后,toJson 代码补全立即显示出来。

长期 macro 目标

最终目标是使社区能够创建自己的macro。这提高了 Dart 编程的抽象级别。以数据类为例,这是 Dart 语言中得票最高的功能。我们考虑在 Dart 中添加对数据类的内置支持,但了解到关于这样一个结构应该支持什么的意见存在显著差异,以便为自己设定一个标准。字段应该是 immutable 吗?它应该支持 equals 吗? hashCode 呢?也许 toString ?我们得出结论,支持macro系统将是更好的方法。社区可以创建自己的抽象类型,从而实现更具可扩展性的实验和多样性。

设计和实现如此强大的macro系统是一项重大的任务。我们决心以一种不会对核心 Dart 开发者使用案例产生不利性能影响的方式来完成。这些使用案例包括代码辅助和自动完成、代码分析和热重载。考虑到这一点,我们采取了分阶段的方法:

  • 在今天的发布中,我们提供了一个单个macro JsonCodable 的预览,以便用户开始熟悉使用macro的开发者体验。
  • 如果这个macro的推出顺利进行,那么我们希望在以后的版本中将 JSON macro升级为稳定版本。
  • 与此同时,我们正在努力完成底层macro系统的设计和实现。一旦我们对其性能和稳定性感到自信,最终目标将是让 Dart 开发者社区能够定义自己的macro。

还有很多工作要完成这些阶段。与此同时,您可以阅读文档以了解有关 Dart macro系统的更多信息,并尝试今天的 JsonCodable macro预览。

其他改进

与往常一样,此版本包含所有持续开发工作,以提供可能的最佳 Dart 版本。在此版本中,我们进行了以下改进:

  • 解决了超过 50% 的分析器代码完成错误。(请继续提交问题!)
  • 改进了条件表达式、if-null 表达式和 switch 表达式的类型分析与语言规范的对齐(更新日志)。
  • 从 dart:cli 库中删除了不完整和不一致的工具,以偿还 Dart VM 中的技术债务。
  • 解决了一些不足之处,以改进新的 dart:js_interop 库。

查看更新日志以获取完整故事!不要忘记阅读此版本的 Dart 和 Flutter 联合博客文章,以获取我们共同努力的完整故事!

感谢阅读本文

如果有什么建议,请在评论中让我知道。我很乐意改进。


flutter 学习路径


© 猫哥 ducafecat.com

end