Flutter空安全相關操作符

__white發表於2021-08-17

這是我參與8月更文挑戰的第17天,活動詳情檢視:8月更文挑戰

健全的空安全已在 Dart 2.12 和 Flutter 2 中可用

需知

當你選擇使用空安全時,程式碼中的型別將預設是非空的,意味著 除非你宣告它們可空,它們的值都不能為空。有了空安全,原本處於你的 執行時 的空值引用錯誤將變為 編輯時 的分析錯誤。

? 允許變數為null

int a = null;
複製程式碼

一般來說,int型別的變數無法賦值為null , 在加入空安全後,編譯器會報錯。 若你想讓變數可以為 null,只需要在型別宣告後加上 ?。

int? aNullableInt = null;
String? b = null;

//允許list為null
List<String>? aNullableListOfStrings;

//允許List中的元素為null
List<String?> aListOfNullableStrings = ['one', null, 'three'];

複製程式碼

?. 具有空安全的‘.’

一般我們呼叫某個物件方法或者屬性的時候會採用如下操作:

print(user.name);
複製程式碼

有時我們不知道user是否為空,會加個判空操作:

if(user!=null){
print(user.name)
}
複製程式碼

其實可以替換.?.

print(user?.name);
複製程式碼

當user不為空時 , 此處的?.等價於. 當user為空時,將輸出null。

如果想處理為空時的返回:

print(user?.name ?? '結果為null');
複製程式碼

等價於:

if(user==null||user.name==null){
print('結果為null');
}else{
print('user.name');
}
複製程式碼

優點就是減少程式碼,省略判空操作直接使用,避免為空時的報錯。

! 空斷言運算子

如果你確定具有可為空型別的表示式不為空,則可以使用空斷言運算子 (!) 使 Dart 將其視為不可為空。通過在表示式之後增加 ! ,來告訴 Dart 該值不會為空,並且可以安全地將其分配給不可為空的變數。

當然,如果你錯了,Dart 會在執行時丟擲異常。這使得 !運算子不安全,因此除非你非常確定表示式不為空,否則不要使用它。

int? couldReturnNullButDoesnt() => -3;
int c = couldReturnNullButDoesnt()!.abs();
複製程式碼

這裡因為couldReturnNullButDoesnt方法返回常量,可確認不為null,在使用的時候就可以在後面加上!來告訴dart此表示式必不為null。

切記:在無法確認不為null的時候,千萬不要使用!

late 變數將在未來初始化

一般來說,類中的欄位或頂級變數應該是不可為空的,但不能立即為它們賦值。對於這種情況,請使用 late 關鍵字。

比如你宣告瞭一個變數,你暫時不想賦值,但以後會賦值,可以使用late修飾(最常見的就是需要從伺服器獲取的資料):

late String a;
複製程式碼

如果你確定這個屬性需要在訪問之前被賦值,將它標記為 late

late 會在執行時檢查。所以請你僅在確定它被使用前一定會被初始化的情況下使用 late

late還有一個作用是延遲載入 ,相當於lazy的特性:

int _computeValue() {
  print('In _computeValue...');
  return 3;
}

class CachedValueProvider {
  final _cache = _computeValue();
  int get value => _cache;
}

void main() {
  print('Calling constructor...');
  var provider = CachedValueProvider();
  print('Getting value...');
  print('The value is ${provider.value}!');
}
複製程式碼

以上程式碼,輸出內容是:

Calling constructor...
In _computeValue...
Getting value...
The value is 3!
複製程式碼

如果將_cache用late修飾,那麼列印結果將會改變:

Calling constructor...
Getting value...
In _computeValue...
The value is 3!
複製程式碼

不妨執行一下試試.

相關文章