作者 / Michael Thomsen
Dart 2.12 现已发布,其中包含健全的空安全和 Dart FFI 的稳定版。空安全是我们最新主打的一项生产力强化功能,意在帮助您规避空值错误,以前这种错误通常很难被发现,您可以观看下面这支视频了解详情。FFI 则是一种互操作机制,支持调用以 C 语言编写的既有代码,例如调用 Windows Win32 API。欢迎大家即刻开始使用 Dart 2.12。
△ Dart 健全的空安全
健全的空安全
https://dart.cn/null-safety
Dart FFI
https://dart.cn/guides/libraries/c-interop
Win32 API
https://pub.flutter-io.cn/packages/win32
腾讯视频链接
https://v.qq.com/x/page/n3208kis0wj.html
Bilibili 视频链接
https://www.bilibili.com/video/BV1GV411Y7sW/
Dart 平台的独特功能
在详细了解健全空安全和 FFI 之前,我们先来讨论一下它们在哪些方面契合了我们对 Dart 平台的期望。编程语言往往有很多类似的功能,例如,很多语言都支持面向对象的编程或在 web 上运行。真正将各个语言区分开来的,是其独特的功能组合。
Dart 具有横跨三个维度的独特功能组合:
可移植性: 高效的编译器可针对设备生成 x86 和 ARM 机器代码,并针对 web 生成优化的 JavaScript。同时兼容移动设备、桌面 PC、应用后端等多种目标平台。大量的开发库和 package 提供了可在所有平台上使用的一致的 API,进一步降低了开发者创建真正多平台应用的成本。
目标平台
https://dart.cn/overview#platform
高生产力: Dart 平台支持热重载,因此可在原生设备和 web 上实现快速迭代开发。此外,Dart 还提供了丰富的结构,如 isolates 和 async/await 等,用以处理和实现常见的并发和事件驱动的应用模式。
稳健: Dart 的健全空安全类型系统可以在开发过程中就捕捉到错误。整个平台拥有极好的可扩展性和可靠性,已经被大量且多样的应用在累计超过十年的生产环境中实战检验过,其中包括 Google 的一些关键业务应用,如 Google Ads 和 Google Assistant 等。
健全空安全增强了类型系统的稳健性,同时提高了性能。借助 Dart FFI,您可以获得更强的可移植性,同时沿用由 C 语言编写的既有代码,在处理对性能要求极为严苛的任务时,可以尽情使用经过精心优化的 C 语言代码。
健全的空安全
自 Dart 2.0 中引入健全类型系统以来,Dart 语言中最重大的新增内容便是健全空安全。空安全进一步增强了类型系统,让您能够捕捉到空值错误,此类错误经常导致应用崩溃。启用空安全后,您就可以在开发过程中捕捉到空值错误,避免应用在生产环境中发生崩溃。
Dart 2.0
https://medium.com/dartlang/announcing-dart-2-80ba01f43b6
健全空安全的设计围绕一套核心原则展开。您可以阅读官方文档了解这些原则对开发者的影响。
空安全的原则
https://dart.cn/null-safety#null-safety-principles
默认不可空: 从根本改变类型系统
在空安全出现之前,开发者面临的核心挑战在于无法区分预期收到空值的代码和不接受空值的代码。几个月前,我们在 Flutter 的 master 渠道中发现了一个错误,多个 flutter 工具命令在特定计算机配置下会发生崩溃,并触发空值错误: The method '>=' was called on null。问题出自如下代码:
final int major = version?.major;
final int minor = version?.minor;
if (globals.platform.isMacOS) {
// plugin path of Android Studio changed after version 4.1.
if (major >= 4 && minor >= 1) {
...
您发现错误了吗?由于 version 可能为空,所以 major 和 minor 也可能为空。如果单独检查此处代码,这一错误似乎并不难发现。但实际上,即使经过了严格的代码审查过程 (如 Flutter repo 所采用的代码审查流程),也总是难免有这样的漏网之鱼。在启用空安全后,静态分析能够立即捕捉到这一问题 (如下图)。您可以在 DartPad 中亲自上手体验。