简介

在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/

最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!

欢送关注我的公众号:「程序那些事」,懂技术,更懂你!