关于dart:dart系列之安全看我dart中的安全特性null-safety

简介

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

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

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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理