简介
在Dart 2.12中引入了null safety的新个性,也就是说dart程序中默认类型都是非空的,除非你显示通知编译器,这个类型能够为空。
看起来是一个小小的改变,然而这个小小的改变导致了很多Dart包的大版本升级,从而导致应用Dart2.12之前的版本跟应用dart2.12之后的版本齐全就是两个不同的世界。
真的这么微妙吗?一起来看看Dart 2.12 null safety的个性吧。
Non-nullable类型
在感触Non-nullable类型之前,咱们先看一段代码:
void main(){ String name; print('name is $name.');}
代码很简略,咱们定义了一个String类型的name字符串,而后在print语句中打印它。
如果你是在dart 2.12版本之前,那么是没有问题的。
然而到了2.12,则会报错:
The non-nullable local variable 'name' must be assigned before it can be used.Try giving it an initializer expression, or ensure that it's assigned on every execution path.
意思就是说,name是非空的,你必须要给他赋个值。
通过强制不为空,保障了代码的安全性,十分好用。
那么如果name就能够为空怎么解决呢?
别急,咱们能够给能够为空的类型前面加上?即可:
void main(){ String? name; print('name is $name.');}
Nullable List Of Strings 和 List Of Nullable Strings
如果咱们要创立一个List,list外面蕴含的是String,则能够这样创立:
List<String> aListOfStrings = ['one', 'two', 'three'];
在dart 2.12中,非空查看也被用到了泛型中,所以,默认状况下List中的String也不能为空,如果非要为空,则须要这样写:
List<String?> aListOfNullableStrings = ['one', null, 'three'];
对于list自身来说,它也是不能为空的,如果要为空,则须要这样写:
List<String>? aNullableListOfStrings;
!操作符
如果你认为某个对象在应用的时候确定不是null,那么能够在表达式前面增加!,如下所示:
String? word; word = aListOfNullableStrings.first; print(word!.length);
late关键字
有时候,咱们晓得某个对象肯定不是空,然而目前来说,并不能立即对其进行赋值,这时候就须要应用到late关键字。
上面是一个用到late的例子:
class Team { late final Coach coach;}class Coach { late final Team team;}void main() { final myTeam = Team(); final myCoach = Coach(); myTeam.coach = myCoach; myCoach.team = myTeam; print('All done!');}
下面的代码中,咱们有两个类相互援用,然而两个类都是不为空的,如果不应用late,则会编译失败。
应用late就能够在前面适合的时候对类中的属性进行初始化,从而保障代码的运行。
总结
以上就是dart 2.12中新减少的null safety的应用。
本文已收录于 http://www.flydean.com/24-dart-null-safety/
最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!
欢送关注我的公众号:「程序那些事」,懂技术,更懂你!