前沿
年前抽空对新项目进行了空安全迁移,这里简要的说明下。
什么是空安全?
说起空安全就不得不提起Null。
Null 的产生是由于 1965 年的一个偶然事件。
托尼·霍尔(Tony Hoare)是快速排序算法的创造者,也是图灵奖(计算机领域的诺贝尔奖)的获得者。他把 Null 添加到了 ALGOL 语言中,因为它看起来很实用而且容易实现。但几十年后,他后悔了。
Tony 表示,1965 年把 Null 引用加进 ALGOL W 时的想法非常简单,“就是因为这很容易实现。”
但如今再次谈到当初的决定时,他表示这是个价值十亿美元的大麻烦:
“我称之为我的十亿美元错误……当时,我正在设计第一个全面的类型系统,用于面向对象语言的引用。我的目标是确保所有对引用的使用都是绝对安全的,由编译器自动执行检查。但是我无法拒绝定义一个 Null 引用的诱惑,因为它实在太容易实现了。这导致了无法计数的错误、漏洞和系统崩溃。在过去的四十年里,这些问题可能已经造成了十亿美元的损失。”
空安全,顾名思义就是对空引用的安全检测
空安全原则
Dart 的空安全支持基于以下三条核心原则:
默认不可空。除非你将变量显式声明为可空,否则它一定是非空的类型。我们在研究后发现,非空是目前的 API 中最常见的选择,所以选择了非空作为默认值。
渐进迁移。你可以自由地选择何时进行迁移,多少代码会进行迁移。你可以使用混合模式的空安全,在一个项目中同时使用空安全和非空安全的代码。我们也提供了帮助你进行迁移的工具。
完全可靠。Dart 的空安全是非常可靠的,意味着编译期间包含了很多优化。如果类型系统推断出某个变量不为空,那么它 永远 不为空。当你将整个项目和其依赖完全迁移至空安全后,你会享有健全性带来的所有优势——更少的 BUG、更小的二进制文件以及更快的执行速度。
为什么项目现在才迁入空安全?
其实在Dart2.0刚出来不久,就开始考虑空安全迁入。但当时大部分的插件都未支持空安全,考虑到项目的稳定和维护成本,暂缓了空安全的支持。
但如今,绝大多数Flutter插件已经支持空安全,时机已完全成熟,有必要将项目迁入。
如何迁入空安全?
其实,官方已经有完整的迁入指南文档,我们只需要一步一步的按照文档操作即可 官方文档
这简要介绍下流程:
- Flutter sdk切换到2.12或者更高
- 命令检查项目的package的空安全状态,并升级到空安全版本
// 检查package空安全状态
dart pub outdated --mode=null-safety
// 升级依赖
dart pub upgrade --null-safety
- 迁移,使用迁移工具或者手动迁移
代码迁移处理
代码迁移处理,主要分为四个部分:
- 变量允许为null,即在类型后面添加?
int? id;
- 对于确认不为空的变量通过!断定
db!.isOpe
- 对于需要稍后初始化的变量通过late定义
late Animation _animation;
- 对于申明可为空的变量在使用前添加空判断,即?.
_globalKey.currentState?.onSelected();
- 对于函数方法中需要不为空的参数,通过可选参数required指定:
Widget buildBottomNavigationBar({
required List<BottomNavigationBarItem> items,
required int currentIndex,
required ValueChanged<int> onTap,
}) {}
总结
每一门新技术的发展都是从简陋到健全,生态从单一到丰富。我们既要从长远角度出发,思考问题。又要着眼于实际情况,合理安排,尽量减少其他外在因素产生的影响。这其中的衡量,是一个优秀Coder品质的展现。最后,谢谢大家的阅读!
参考资料: