Dardo 2.17 lanzado oficialmente

Publicado por Michael Thomsen, gerente de producto, Google Dart Team, en el blog oficial de Dart el 12 de mayo de 2022

Con el lanzamiento de Flutter 3 en esta conferencia I/O, también lanzamos oficialmente el SDK estable de Dart 2.17 al mismo tiempo. Esta versión se basa en nuestros temas centrales: productividad líder y portabilidad de la plataforma.

Dart 2.17 proporciona nuevas funciones de lenguaje: soporte de enumeración para variables miembro, herencia de parámetros de superclase mejorada y parámetros con nombre más flexibles . También package:lintsabrimos la versión 2.x para , que es un conjunto de reglas de pelusa oficiales, que es un conjunto de reglas de pelusa integrado de acuerdo con las mejores prácticas de Dart que resumimos. Al mismo tiempo, también actualizamos la documentación de la API de la biblioteca principal con un código de muestra enriquecido. Y, para mejorar las funciones de integración de la plataforma, proporcionamos una nueva plantilla en el complemento Flutter que usa C para la interoperabilidad dart:fficon plataformas nativas, soporte experimental para el conjunto de instrucciones RISC-V y soporte de firma de ejecutables de macOS y Windows.

Las nuevas funciones de los lenguajes de programación aumentan la productividad

Hemos estado mejorando continuamente el lenguaje de programación Dart, agregando nuevas funciones y mejorando las existentes para ayudar a los desarrolladores a trabajar de manera más eficiente. Dart 2.17 agrega soporte para variables miembro de enumeración, optimiza la forma en que se usan los parámetros con nombre en los constructores y comienza a usar parámetros de superclases heredadas para reducir el código detallado y repetitivo.

Compatibilidad mejorada para la enumeración de variables miembro

Las enumeraciones son excelentes para representar un conjunto discreto de estados. Por ejemplo, podemos describir el agua como enum Water { frozen, lukewarm, boiling }. Pero, ¿qué pasaría si enumquisiéramos agregar algunos métodos, por ejemplo, para convertir cada estado en temperatura y admitir enumla conversión a String? Tal vez podríamos usar métodos de extensión para agregar un waterToTemp()método , pero tenemos que vigilar enumsu sincronización con . StringPorque queremos anular el toString()método, pero no admite hacerlo.

Las variables miembro de los tipos de enumeración ahora son compatibles con Dart 2.17. Esto significa que podemos agregar campos que contienen estado, constructores que establecen estado, métodos que tienen funcionalidad e incluso anular métodos existentes. Esta ha sido una demanda constante de muchos desarrolladores en la comunidad, y este es nuestro tercer problema votado .

Continuando con el Waterejemplo , podemos agregar un intcampo que contenga la temperatura y agregar intun constructor predeterminado que reciba un :

enum Water 
  const Water(this.tempInFahrenheit);

  final int tempInFahrenheit;
}
复制代码

Para garantizar que el constructor se llame correctamente cuando se crea la enumeración, debemos agregar una llamada explícita a cada valor de enumeración:

enum Water {
  frozen(32),
  lukewarm(100),
  boiling(212);
}
复制代码

Para admitir la conversión de enum a String, simplemente podemos anular el toStringmétodo , ya que enumstambién hereda de Object:

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

De esta manera, tiene una clase de enumeración completamente funcional que se puede instanciar fácilmente y métodos que se pueden llamar en cualquier lugar:

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

A continuación se muestran ejemplos completos de ambos métodos; con estos cambios, la nueva versión del código es más fácil de leer y mantener.

inicializador de superclase

Cuando su código tiene herencia de tipos, una práctica común es pasar algunos parámetros del constructor al constructor de la superclase. Para esto, la subclase necesita 1) enumerar cada parámetro en su constructor 2) llamar al constructor de la superclase con esos parámetros. Esto dio como resultado una gran cantidad de duplicación de código, lo que dificultaba la lectura y el mantenimiento del código.

几位 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:convertDart 2.162.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 上进行部署。

También nos mantenemos a la vanguardia de las plataformas emergentes y continuamos expandiendo el conjunto de plataformas que admitimos. RISC-V es un nuevo sistema de conjunto de instrucciones. RISC-V International es una organización global sin fines de lucro que posee la especificación RISC-V, lo que hace que el conjunto de instrucciones sea gratuito y abierto. Todavía es una plataforma emergente, pero estamos entusiasmados con su potencial, por lo que nuestro 2.17.0–266.1.betalanzamiento de Linux incluye soporte experimental para ella. ¡Queremos escuchar sus comentarios, puede hacer preguntas o compartir su experiencia!

¡Comienza con Dart 2.17!

Esperamos que el lanzamiento oficial de Dart 2.17 lo impresione y lo ayude a mejorar su productividad, además de llevar sus aplicaciones a más plataformas. Descargue Dart 2.17 y comience ahora, también instale y use Flutter 3, usando el SDK integrado de Dart.


Enlace original :

medium.com/dartlang/da…

Localización : Equipo CFUG

Enlace chino : flutter.cn/posts/dart-…

Supongo que te gusta

Origin juejin.im/post/7098130532126441503
Recomendado
Clasificación