前言
Flutter 2.0的使用已经有一段时间了,在某平台看到一位大佬分享的关于Flutter空安全的一些使用经验和理解,我看完也觉得很有共鸣。
原文链接:https://juejin.cn/post/6986455348026540068
Dart空安全
空安全是什么?
在空安全下,运行时的NullPointer Exception错误被提前到了开发阶段。
即:
void main() { // 在空安全下, 开发阶段就会报错,而非运行时 String name; debugPrint(name); } 复制代码
类型上也有了变化,这里贴两张官方的类型关系图深入理解空安全 :
非空安全时代:
空安全时代
可以看到,Null这个类型变成了一个单独的类,而非所有类的子类,换言之:
void main() {
String a = null;
}
非空安全下:
因为Null是所有类型的子类,基于多态性的原理,这种书写方式是正确的。
在空安全下:
Null独立了出去,那么当你再像上面那样书写时,就会报错了,因为这本质上发生了类型转换的错误.
复制代码
空安全有什么?
新增了关键字,并对原有关键字的含义做了拓展 :
? -> 可空, 如: int a?;
! -> 非空 如: int b = a!;
late -> 延迟初始化 如: late int a;
required -> 可选参数的不可空 如: {
required int a}
复制代码
而含义的对象就是开发工具了,下面逐一对它们进行介绍。
关键字: ?
我们在开发过程中,相当多的参数变量并不一定为必传,因此我们可以用 ? 来标注其为可空。
///通过问号,我们可以告知编辑器(及使用者),style是可空的(有点像可选参数)
Widget buildTextWidget(String text, TextStyle? style) {
return Text(text, style: style);
}
调用时:
void main() {
buildTextWidget('hello world !',null