目錄

健全的空安全

Dart 語言包含了健全的空安全特性。

空安全會在編譯期防止意外存取 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();

若你想讓變數可以為 null,只需要在型別聲明後加上 ?

int? aNullableInt = null;

空安全的原則

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

你可以閱讀 遷移指南 來學習如何遷移你的程式碼至空安全。

學習更多

想了解關於空安全的更多內容,可檢視以下的資源內容: