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

1次阅读

共计 1561 个字符,预计需要花费 4 分钟才能阅读完成。

简介

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

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

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

正文完
 0