dart 空安全
Dart空安全支持基于以下三条核心原则
- 默认不可空:除非您把变量显式生命为可空,否则它一定是非空类型;
- 渐进迁移:您可以自由地选择何时进行迁移,多少代码会进行迁移;
- 完全可靠:Dart的空安全是非常可靠的,意味着编译期间包含了很多优化;
如果类型系统推断出某个变量不为空,那么它永远不为空。当您将整个项目和其依赖完全迁移至空安全后,您会享有及健全性带来的所有优势–更少的BUG、更小的二进制文件以及更快的执行速度。
空安全运算符
! 空值断言操作符
当我们排除变量或参数的可空的可能后,可以通过!来告诉编译器这个可空的变量或参数不可空,这对我们进行方法传参或将可空参数传递给一个不可空的入参时特别有用。
?. 左边如果为空返回 null,否则返回右边的值,该运算符常用于防止空异常
A?.B
如果 A 等于 null,那么 A?.B 为 null
如果 A 不等于 null,那么 A?.B 等价于 A.B
?? 左边如果为空返回右边的值,否则不处理,该运算符常用于设置默认值
List list;
int length = list?.length ?? -1;
启用空安全
Flutter2默认启用了空安全。
environment:
sdk: ">=2.12.0 <3.0.0" // SDK >= 2.12.0 表示开启空安全检查
若想关闭空安全检查,可以将SDK的支持范围调整到2.12.0以下即可,如:
environment:
sdk: ">=2.7.0 <3.0.0"
空安全适配
首先对文件进行分类:
-
自定义Widget
-
数据模型(model):
服务端下发数据:适配前,需要和服务端沟通好,模型中的哪些字段可空,哪些字段是一定会下发的。对于一定会下发的字段,通过late来修饰,或给定默认值;对于不能保证一定下发的字段,通过?将其修饰为可空的变量。
自定义模型数据:对于可空字段通过?进行修饰;对于不可空字段,需求在构造函数的对应字段面前,添加 required 修饰符来表示这个参数是必传参数 -
单例:懒汉模式的单例,单例instance设置为可空;getInstance中因为会有null时创建单例,所以返回instance时将其转换成非空;
-
三方插件的空安全适配:在Dart的官方插件平台上的主流插件都陆续进行了空安全支持,如果你的项目开启了空安全那么所有使用的插件也必须是要支持空安全的,否则会导致无法编译。支持了空安全的插件,会带有标记。