dart系列之:安全看我,dart中的安全特性null safety

flydean發表於2021-12-22

簡介

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

最通俗的解讀,最深刻的乾貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!

歡迎關注我的公眾號:「程式那些事」,懂技術,更懂你!

相關文章