作者 / Michael Thomsen
Dart 212。
- 健全的空安全https://dart/guides/libraries/c-interop
- Win32 APIhttps://pub/packages/win32
- 腾讯视频链接
https://v/x/page/n3208kis0wjbilibili/overview#platform
- 高生产力: Dart 平台支持热重载,因此可在原生设备和 web 上实现快速迭代开发。此外,Dart 还提供了丰富的结构,如 isolates 和 async/await 等,用以处理和实现常见的并发和事件驱动的应用模式。
- 稳健: Dart 的健全空安全类型系统可以在开发过程中就捕捉到错误。整个平台拥有极好的可扩展性和可靠性,已经被大量且多样的应用在累计超过十年的生产环境中实战检验过,其中包括 Google 的一些关键业务应用,如 Google Ads 和 Google Assistant 等。
健全空安全增强了类型系统的稳健性,同时提高了性能。借助 Dart FFI,您可以获得更强的可移植性,同时沿用由 C 语言编写的既有代码,在处理对性能要求极为严苛的任务时,可以尽情使用经过精心优化的 C 语言代码。
健全的空安全
自 Dart 20https://medium/null-safety#null-safety-principles
默认不可空: 从根本改变类型系统
在空安全出现之前,开发者面临的核心挑战在于无法区分预期收到空值的代码和不接受空值的代码。几个月前,我们在 Flutter 的 master 渠道中发现了一个错误,多个 flutter 工具命令在特定计算机配置下会发生崩溃,并触发空值错误: The method '>=' was called on null。问题出自如下代码:
这只是一个非常简单的错误。我们早期在 Google 内部的代码中使用空安全时,捕捉到的复杂错误远多于此。其中一些是多年前就已经发现的 bug,但在通过空安全进行额外的静态检查前,很多团队都未能找到原因。 为了帮助您将现有代码迁移至空安全,我们提供了迁移工具和迁移指南。该工具会首先分析您所有的代码,然后您可以交互式地查看工具推断出的可空属性,如果您不同意工具得出的结论,则可以添加可空性提示以更改推断。添加迁移提示可能会大幅提升迁移质量。 去年,我们提供了健全空安全的数个预览版和 Beta 版,旨在为生态系统提供首批支持空安全的 package。这项工作非常重要,我们建议大家有序迁移至健全空安全,也就是说,在所有依赖项迁移完成之前,最好不要迁移自己的 package 或应用。 完成迁移后,您的项目就处于健全的空安全模式下了。这意味着 Dart 能够完全确保具有不可空类型的表达式不为空。当 Dart 分析完您的代码并确定某个变量不可为空时,该变量将始终不可为空。Dart 与 Swift 都拥有健全的空安全,但有些编程语言在这方面仍有待改进。 Dart 的健全空安全还暗含另一项备受期待的优势: 您的程序可以更小、更快。由于 Dart 能够确保不可为空的变量绝不为空,因此可以实现优化。例如,Dart 的运行前 (ahead-of-time, AOT) 编译器可以生成更小更快的原生代码,因为当其知道变量不为空时,便不再需要添加空值检查了。final int major = version?minor;
if (globalsisMacOS) {
// plugin path of Android Studio changed after version 4
if (major >= 4 && minor >= 1) {
dev/0e9797be7488d8ec6c3fca92b7f2740f?null_safety=true
// 在空安全的 Dart 中,以下均不可为空
var i = 42; // Inferred to be an int12。您甚至可以在尚未启用空安全的应用或 package 中依赖已启用空安全的 package。
Dart 生态系统的空安全迁移状态
充分健全的空安全的优势
- Dart FFIhttps://dart12 开始,也支持按值传递。下方的简单示例中,两个 C 函数使用引用和值完成传递:
struct Link { double value; Link* next; }; void MoveByReference(Link* link) { link->value = link->value + 10value = link0; return link; }
嵌套结构
C API 通常使用嵌套结构,这种结构本身也包含结构,比如以下示例:
struct Wheel { int spokes; }; struct Bike { struct Wheel front; struct Wheel rear; int buildYear; };
从 Dart 2toUtf8('Michael'); var result = helloWorldInC(arg); print(Utf8free(pointer); final arg = 'Michael'toDartString); calloc/dart-lang/sdk/issues/44622
- #44621https://githubflutter-io/dart-lang/sdk/issues/36140
- 结构中的内联数组 (#35763)https://github/dart-lang/sdk/issues/38158
- 联合类型 (#38491)https://github/dart-lang/sdk/issues/35770
FFI 使用示例
在过去的几个月中,我们看到大家在使用 Dart FFI 集成一系列基于 C 语言的 API 时,发掘出了许多有创意的用法。下面介绍几个示例:
- open_file 是一个用于在多个平台打开文件的 API,使用 FFI 在 Windows、macOS 和 Linux 上调用操作系统原生 API。https://pub/packages/open_file
- win32 封装了最常用的 Win32 API,便于从 Dart 直接调用各种 Windows API。https://pub/packages/win32
- objectbox 是一个快速数据库,底层由 C 语言实现。https://pub/packages/objectbox
- tflite_flutter 使用 FFI 封装了 TensorFlow Lite API。https://pub/packages/tflite_flutter
Dart 语言的未来计划
健全空安全是这几年我们对 Dart 语言做出的最大改变。接下来,我们将继续稳步改进 Dart 语言和平台。下面简单介绍一些我们在语言设计规划中实验的内容:
- 类型别名 (#65): 将创建类型别名的功能扩展到非函数类型。例如,您可以创建一个 typedef 并将其用作变量类型:
typedef IntList = List<int>;
IntList il = [1,2,3];
- 无符号右移运算符 (#120): 添加新的 >>> 运算符,便于对整数执行无符号移位操作。此运算符可完全重写。
- 通用元数据注解 (#1297): 扩展元数据注解,以同时支持含类型参数的注解。
- 静态元编程 (#1482): 支持静态元编程,即编译期间生成新 Dart 源代码的 Dart 程序,与 Rust 宏 (macro) 和 Swift 函数构建器 (function builder) 类似。该功能目前仍处于早期探索阶段,但我们认为它可能会开启全新用例的大门,打破现在依赖代码生成的僵局。
- 语言设计规划https://github/dart-lang/language/issues/65
- #120https://github/dart-lang/language/issues/1297
- #1482https://githubrust-langhtml
- function builderhttps://githubmd
Dart 212 和 Flutter 212,尽情体验健全空安全和稳定版 FFI。请大家阅览 Dart 和 Flutter 的已知空安全问题。如果您发现其他任何问题,请在Dart 问题跟踪页中报告给我们。
- Dart 2/get-dart
- Flutter 2/docs/get-started/
- Dart 空安全问题https://dart/docs/null-safety#known-issues
- Dart 问题追踪页https://githubdev 上发布了 package,请立即参阅迁移指南,了解如何迁移至健全空安全。迁移有助于依赖您的 package 的其他 package 和应用完成迁移。我们在此向已经完成迁移的开发者们表示感谢!
- pubdev/
- 迁移至空安全https://dart./null-safety/migration-guide
欢迎大家与我们分享自己的健全空安全和 FFI 体验,我们评论区见!
转载自:谷歌开发者原创文章
- pubdev/
- 迁移至空安全https://dart./null-safety/migration-guide
欢迎大家与我们分享自己的健全空安全和 FFI 体验,我们评论区见!
转载自:谷歌开发者原创文章