目錄
keyboard_arrow_down keyboard_arrow_upDart 語言包含了健全的空安全特性。
空安全會在編譯期防止意外存取 null
變數的錯誤的產生。例如,如果一個方法需要整型結果,卻接收到了 null
,你的應用會出現執行時錯誤。這類空參考錯誤在以前除錯是非常困難的。
有了健全的空安全體系,變數預設是「非空」的:它們可以賦予與定義的型別相同型別的任意值(例如 int i = 42
),且永遠不能被設定為 null
。你可以指定一個類別型為可空(例如 int? i
),這類變數只能包含對應型別的值或者 null
。
健全的空安全透過對非空變數的未被初始化或以 null
初始化的情況進行標記,把潛在的 執行時錯誤 轉變成了 編輯時 的分析錯誤。這樣的特性讓你在開發應用的過程中就可以修復這類錯誤。
透過範例程式碼介紹空安全
有了空安全,下面程式碼中所有的變數都是非空的:
// In null-safe Dart, none of these can ever be null.
var i = 42; // Inferred to be an int.
String name = getFileName();
final b = Foo();
int? aNullableInt = null;
-
你可以透過 空安全 Codelab 互動範例快速瞭解空安全。
-
更深入的探討,可以閱讀文件 深入理解空安全。
空安全的原則
Dart 的空安全支援基於以下三條核心原則:
-
預設不可空。除非你將變數顯式宣告為可空,否則它一定是非空的型別。我們在研究後發現,非空是目前的 API 中最常見的選擇,所以選擇了非空作為預設值。
-
漸進遷移。你可以自由地選擇何時進行遷移,多少程式碼會進行遷移。你可以使用混合模式的空安全,在一個專案中同時使用空安全和非空安全的程式碼。我們也提供了幫助你進行遷移的工具。
-
完全可靠。Dart 的空安全是非常可靠的,意味著編譯期間包含了很多最佳化。如果型別系統推斷出某個變數不為空,那麼它 永遠 不為空。當你將整個專案和其依賴完全遷移至空安全後,你會享有健全性帶來的所有優勢—— 更少的 BUG、更小的二進位制檔案以及更快的執行速度。
啟用和禁用空安全
健全的空安全已在 Dart 2.12 和 Flutter 2.0 及更高版本中可用。 Dart 3 及以後的版本將 只支援 健全的空安全。
想要啟用健全空安全,你需要將 SDK 的最低版本約束
設定為 2.12 或者更高的 語言版本。例如,你的 pubspec.yaml
可以設定為如下的限制:
environment:
sdk: '>=2.12.0 <3.0.0'
遷移現有的 package 或應用
Dart SDK 內建了 dart migrate
工具。該工具會幫助你遷移你的程式碼至健全的空安全。如果你的程式碼是在 Dart 2.12 或更早前編寫的(未完全支援空安全),你就可以使用這個工具進行遷移。
$ cd my_app
$ dart migrate
你可以閱讀 遷移指南 來學習如何遷移你的程式碼至空安全。
學習更多
想了解關於空安全的更多內容,可檢視以下的資源內容: