关于项目空安全迁入操作

前沿

年前抽空对新项目进行了空安全迁移,这里简要的说明下。

什么是空安全?

说起空安全就不得不提起Null。
Null 的产生是由于 1965 年的一个偶然事件。
托尼·霍尔(Tony Hoare)是快速排序算法的创造者,也是图灵奖(计算机领域的诺贝尔奖)的获得者。他把 Null 添加到了 ALGOL 语言中,因为它看起来很实用而且容易实现。但几十年后,他后悔了。
Tony 表示,1965 年把 Null 引用加进 ALGOL W 时的想法非常简单,“就是因为这很容易实现。”

但如今再次谈到当初的决定时,他表示这是个价值十亿美元的大麻烦:

“我称之为我的十亿美元错误……当时,我正在设计第一个全面的类型系统,用于面向对象语言的引用。我的目标是确保所有对引用的使用都是绝对安全的,由编译器自动执行检查。但是我无法拒绝定义一个 Null 引用的诱惑,因为它实在太容易实现了。这导致了无法计数的错误、漏洞和系统崩溃。在过去的四十年里,这些问题可能已经造成了十亿美元的损失。”

空安全,顾名思义就是对空引用的安全检测

空安全原则

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

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

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

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

为什么项目现在才迁入空安全?

其实在Dart2.0刚出来不久,就开始考虑空安全迁入。但当时大部分的插件都未支持空安全,考虑到项目的稳定和维护成本,暂缓了空安全的支持。

但如今,绝大多数Flutter插件已经支持空安全,时机已完全成熟,有必要将项目迁入。

如何迁入空安全?

其实,官方已经有完整的迁入指南文档,我们只需要一步一步的按照文档操作即可 官方文档

这简要介绍下流程:

  1. Flutter sdk切换到2.12或者更高
  2. 命令检查项目的package的空安全状态,并升级到空安全版本
// 检查package空安全状态
dart pub outdated --mode=null-safety
// 升级依赖
dart pub upgrade --null-safety
  1. 迁移,使用迁移工具或者手动迁移

代码迁移处理

代码迁移处理,主要分为四个部分:

  1. 变量允许为null,即在类型后面添加?
int? id;
  1. 对于确认不为空的变量通过!断定
db!.isOpe
  1. 对于需要稍后初始化的变量通过late定义
late Animation _animation;
  1. 对于申明可为空的变量在使用前添加空判断,即?.
 _globalKey.currentState?.onSelected();
  1. 对于函数方法中需要不为空的参数,通过可选参数required指定:
Widget buildBottomNavigationBar({
  required List items,
  required int currentIndex,
  required ValueChanged onTap,
}) {}

总结

每一门新技术的发展都是从简陋到健全,生态从单一到丰富。我们既要从长远角度出发,思考问题。又要着眼于实际情况,合理安排,尽量减少其他外在因素产生的影响。这其中的衡量,是一个优秀Coder品质的展现。最后,谢谢大家的阅读!

参考资料:

  • 后悔发明Null:堪称CS史上最严重错误,至少造成10亿美金损失
  • 健全的空安全

你可能感兴趣的:(关于项目空安全迁入操作)