Dart空安全

The Dart language comes with sound null safety.

Posted by Kinsomy Blog on May 26, 2023

背景

最近在对项目做flutter升级3.3.10的相关工作,其中就包括升级升级Dart到2.12以上来支持空安全。下面将对Dart的空安全进行介绍,并讲解如何从旧版本Dart进行空安全的迁移。

空安全介绍

Dart3 计划于2023年中发布,始终支持空安全,届时使用Dart3将不再允许非空安全的代码运行。

空安全的原则

Dart 的空安全支持基于以下三条核心原则:

  • 默认不可空

    除非你将变量显式声明为可空,否则它一定是非空的类型。我们在研究后发现,非空是目前的 API 中最常见的选择,所以选择了非空作为默认值。

  • 渐进迁移

    你可以自由地选择何时进行迁移,多少代码会进行迁移。你可以使用混合模式的空安全,在一个项目中同时使用空安全和非空安全的代码。我们也提供了帮助你进行迁移的工具。

  • 完全可靠

    Dart 的空安全是非常可靠的,意味着编译期间包含了很多优化。如果类型系统推断出某个变量不为空,那么它 永远 不为空。当你将整个项目和其依赖完全迁移至空安全后,你会享有健全性带来的所有优势—— 更少的 BUG、更小的二进制文件以及更快的执行速度。

启用空安全

空安全的特性是从Dart2.12开始支持的,所以想要项目中启用空安全,只需要在pubspec.yaml配置文件中,将dart使用的最低版本设置到2.12及以上即可。

environment:
  sdk: ">=2.1.0 <3.0.0"
# 替换为
environment:
  sdk: ">=2.12.0 <3.0.0"

深入理解空安全

这里直接引用官网的文章,对Dart空安全做了详细的介绍。

深入理解空安全 文/ Bob Nystrom, Google Dart 团队工程师

这篇文章有助于在后续的项目空安全迁移工作。

空安全迁移

官方迁移指南 迁移至空安全 | Dart

Gradual null safety migration for large Dart projects

参照这两篇指南就可以完成项目的空安全迁移。

查看依赖关系

在大型项目中,项目本身会拆分成许多flutter模块作为二方库,他们有分别依赖了其他三方库。

建议按照自底向上的顺序进行空安全迁移,避免迁移完上方模块后,因为下方模块空安全迁移出现了变更继而影响依赖该模块的上方模块出现返工。

因此我们需要先理清项目的整体依赖关系。

在项目根目录执行下面的命令查询依赖关系

dart pub deps

命令行会输出依赖关系,依赖关系图里面有我们自己的二方库,也有依赖外部的三方库。

确保外部三方库升级至支持空安全的版本

使用如下命令可以查看所有依赖版本是否支持空安全,以及支持空安全的最低版本

dart pub outdated --mode=null-safety

当然也可以去pub.dev上找到插件的version列表,选择合适的版本进行升级,version列表上会有支持空安全的版本标识。

迁移自有模块

按照上面的依赖关系,按顺序找到需要需要迁移的模块,进入到模块根目录,执行下面的命令可以启用官方迁移工具。

dart migrate

View the migration suggestions by visiting:

  http://127.0.0.1:60278/Users/you/project/mypkg.console-simple?authToken=Xfz0jvpyeMI%3D

命令行会输出迁移工具链接,在浏览器打开,迁移工具对代码进行分析做了迁移推断,迁移工具并非完全准确,所以需要对代码进行分析,调整代码。