健全的空安全已在 Dart 2.12 和 Flutter 2 中可用
需知
当你选择使用空安全时,代码中的类型将默认是非空的,意味着 除非你声明它们可空,它们的值都不能为空。有了空安全,原本处于你的 运行时 的空值引用错误将变为 编辑时 的分析错误。
? 允许变量为null
int a = null;
一般来说,int类型的变量无法赋值为null , 在加入空安全后,编译器会报错。 若你想让变量可以为 null,只需要在类型声明后加上 ?。
int? aNullableInt = null;
String? b = null;
//允许list为null
List<String>? aNullableListOfStrings;
//允许List中的元素为null
List<String?> aListOfNullableStrings = ['one', null, 'three'];
?. 具有空安全的‘.’
一般我们调用某个对象方法或者属性的时候会采用如下操作:
print(user.name);
有时我们不知道user是否为空,会加个判空操作:
if(user!=null){
print(user.name)
}
其实可以替换. 为?. :
print(user?.name);
当user不为空时 , 此处的?. 等价于. 当user为空时,将输出null。
如果想处理为空时的返回:
print(user?.name ?? '结果为null');
等价于:
if(user==null||user.name==null){
print('结果为null');
}else{
print('user.name');
}
优点就是减少代码,省略判空操作直接使用,避免为空时的报错。
! 空断言运算符
如果你确定具有可为空类型的表达式不为空,则可以使用空断言运算符 (!) 使 Dart 将其视为不可为空。通过在表达式之后增加 ! ,来告诉 Dart 该值不会为空,并且可以安全地将其分配给不可为空的变量。
当然,如果你错了,Dart 会在运行时抛出异常。这使得 !运算符不安全,因此除非你非常确定表达式不为空,否则不要使用它。
int? couldReturnNullButDoesnt() => -3;
int c = couldReturnNullButDoesnt()!.abs();
这里因为couldReturnNullButDoesnt 方法返回常量,可确认不为null,在使用的时候就可以在后面加上! 来告诉dart此表达式必不为null。
切记:在无法确认不为null的时候,千万不要使用!
late 变量将在未来初始化
一般来说,类中的字段或顶级变量应该是不可为空的,但不能立即为它们赋值。对于这种情况,请使用 late 关键字。
比如你声明了一个变量,你暂时不想赋值,但以后会赋值,可以使用late修饰(最常见的就是需要从服务器获取的数据):
late String a;
如果你确定这个属性需要在访问之前被赋值,将它标记为 late
late 会在运行时检查。所以请你仅在确定它被使用前一定会被初始化的情况下使用 late
late还有一个作用是延迟加载 ,相当于lazy的特性:
int _computeValue() {
print('In _computeValue...');
return 3;
}
class CachedValueProvider {
final _cache = _computeValue();
int get value => _cache;
}
void main() {
print('Calling constructor...');
var provider = CachedValueProvider();
print('Getting value...');
print('The value is ${provider.value}!');
}
以上代码,输出内容是:
Calling constructor… In _computeValue… Getting value… The value is 3!
如果将_cache用late修饰,那么打印结果将会改变:
Calling constructor… Getting value… In _computeValue… The value is 3!
不妨运行一下试试.
|