Dart Sound Null Safety 概覽
Dart 2.12, Flutter 2 特性
Dart SDK 約束:
environment:
sdk: ">=2.12.0 <3.0.0"
介紹
在對空指針調(diào)用方法的時候肴掷,Dart 會拋出 NoSuchMethodError
的異常敬锐。
// Without null safety:
bool isEmpty(String string) => string.length == 0;
main() {
isEmpty(null);
}
因為 null 本身在 Dart 中也是個實例,是 Null 類的實例, 而 Null 類中并無此 length getter 方法所以拋異常
class Null {
factory Null._uninstantiable() {
throw UnsupportedError('class Null cannot be instantiated');
}
external int get hashCode;
/** Returns the string `"null"`. */
String toString() => "null";
}
作用
- 能夠讓在你在開發(fā)階段就可以捕獲到由 null 而引發(fā)的 app 崩潰錯誤呆瞻。
- 讓程序更快更小台夺,因為不需要對 non-nullable 變量進行判斷是否為 null 了。
特性
- 默認變量的聲明值都不能為 null, 即: non-nullable痴脾。
- 在變量的數(shù)據(jù)類型聲明后加 ? 表示該變量可以有值也可以為 null, 即 nullable颤介。
int? aNullableInt = null;
核心設(shè)計原則
- 默認是 non-nullable: 如果沒有指定變量為 nullable,默認即為 non-nullable赞赖。
- 逐步遷移: 在工程中可以同時存在空安全和非空安全混編的代碼滚朵,并提供工具逐步遷移。
- 完全符合健壯性: 只要類型系統(tǒng)確定該變量是 non-nullable前域,即該變量永遠都不會為 null, 并開啟了編譯器優(yōu)化辕近,擁有更小的二進制以及更快的運行速度。
操作符
null-safety相關(guān)操作符 ! (assertion operator)话侄、亏推?、late
, 處理 nullable 的操作符 if年堆、??吞杭、?.
late 關(guān)鍵字用于當(dāng)無法對 non-nullable 立即賦值的時候,可以用該關(guān)鍵字延遲賦值, 注意 late 關(guān)鍵字和 fianl 是可以共存的变丧。以下三點
- 不需要立即賦值芽狗。
- 可以稍后賦值
- 在訪問之前確保賦值了。(沒賦值即訪問拋異常
LateInitializationError
)
late 除了可以延遲賦值外痒蓬,還可以使成員方法懶加載,這對于讀取大量耗時資源的時候十分有效童擎,因為這些資源有可能用戶不會用到,但是如果一開始就把這些資源就讀取進來是沒必要的攻晒,想做到需要讀取的時候再進行讀取顾复。
?. 操作符號在 null-safety 有短路的功能,例如 person?.dog.age 如果 person 為 null鲁捏, 那么整條表達式就直接返回 null 了芯砸。
request
在 null-safety 當(dāng)中,命名參數(shù) non-nullable 的類型必須要有默認值或是使用 request 關(guān)鍵字來修飾,也就是對于 non-nullable 來說它必須要有值给梅。
List假丧、Set、Map 中的 null-safety
在使用集合的時候需要考慮哪一部分是可以為 null 的动羽。
List包帚、 Set
Map
Map 情況與 List、Set類似, 但有個例外, 當(dāng)通過 Key 拿 value 的時候运吓,該 value 可能會為 null, 也就是說 map['key'] 返回的是一個 nullable
非健全的空安全
Dart 提供兩種模式:
-
混合開發(fā): 為了更加靈活渴邦,如果工程中有些庫支持了 null-safety 而有些庫沒有疯趟,也是支持這種混合開發(fā)躏仇,稱之為非健全的空安全(unsound null safety)。但當(dāng) safe 與 unsafe 的庫互相混入無法在運行時保證完全健全,也就是說還是可能會報
NoSuchMethodError
相關(guān)錯誤怀泊。直接升級到 Flutter 2.0 而沒有遷移 App 就是 unsound null safety霉赡。
-
完全健全(建議):當(dāng)所有的依賴所有的庫全部都遷入 null-safety,此時即為健全的空安全。能夠保證 null 的問題并且編譯器可以進行優(yōu)化使得程序更小更快推励。
遷移
遷移 app/package 前提:
- 等待: 等待工程中所有依賴都已經(jīng)遷移至了 null-safety。
- 遷移: 使用遷移工具。
- 靜態(tài)分析: 靜態(tài)分析暴露出遷移后代碼存在的問題纤垂,并做修復(fù)。
- 測試: 測試你的修改是可以運行的磷账。
通過在 IDE 上增加一些 hit 來讓工具實現(xiàn)預(yù)期的更改峭沦。
教程
DartPad 練習(xí)
Null safety feature tour(入門)
Understanding null safety(深入)
資料
DartPad 練習(xí)
參考資料
遷移指南
遷移視頻
pub 遷移情況統(tǒng)計
Dart and the performance benefits of sound types
the known null safety issues fro Dart
the known null safety issues fro flutter