跳到主要內容

健全的空值安全

Dart 語言強制執行健全的空值安全。

空值安全可防止因意外存取設為 null 的變數而導致的錯誤。

例如,如果某個方法預期是整數但收到 null,您的應用程式就會造成執行階段錯誤。這種錯誤(空值取消參照錯誤)可能難以偵錯。

透過健全的空值安全,所有變數都需要有值。這表示 Dart 將所有變數視為「不可為空值」。您只能指派宣告類型的值,例如 int i=42。您永遠不能將 null 值指派給預設變數類型。若要指定變數類型可以有 null 值,請在類型註解後方加上 ?int? i。這些特定類型可以包含 null 或定義類型的值。

健全的空值安全將潛在的執行階段錯誤轉換為編輯時分析錯誤。使用空值安全時,如果不可為空值的變數發生以下情況,Dart 分析器和編譯器會標記出來:

  • 未以不可為空值的值初始化
  • 已指派 null 值。

這些檢查可讓您在部署應用程式之前修正這些錯誤。

透過範例介紹

#

使用空值安全時,以下程式碼中的任何變數都不能是 null

dart
// With null safety, none of these can ever be null.
var i = 42; // Inferred to be an int.
String name = getFileName();
final b = Foo();

若要指出變數可能具有 null 值,只需在其類型宣告中加入 ? 即可

dart
int? aNullableInt = null;
  • 若要試用一些互動式範例,請試用Dart 速查表中一些以空值安全為導向的範例。
  • 若要深入瞭解空值安全,請查看瞭解空值安全

空值安全原則

#

Dart 透過以下兩個核心設計原則支援空值安全

  • 預設不可為空值。除非您明確告知 Dart 變數可以為空值,否則會將其視為不可為空值。研究發現,在 API 中,不可為空值是目前最常見的選擇,因此選擇此預設值。

  • 完全健全。Dart 的空值安全是健全的,可啟用編譯器最佳化。如果類型系統判斷某個事物不可為空值,則該事物就永遠不可能為空值。將整個專案及其相依性遷移至空值安全後,您就能獲得健全性的完整優勢,不僅能減少錯誤,還能縮小二進位檔並加快執行速度。

Dart 3 與空值安全

#

Dart 3 內建健全的空值安全。Dart 3 會阻止未採用空值安全的程式碼執行。

若要瞭解如何遷移至 Dart 3,請查看Dart 3 遷移指南。未開發空值安全支援的套件會在解析相依性時造成問題

$ dart pub get

Because pkg1 doesn't support null safety, version solving failed.
The lower bound of "sdk: '>=2.9.0 <3.0.0'" must be 2.12.0 or higher to enable null safety.

與 Dart 3 不相容的程式庫會造成分析或編譯錯誤。

$ dart analyze .
Analyzing ....                         0.6s

  error • lib/pkg1.dart:1:1 • The language version must be >=2.12.0. 
  Try removing the language version override and migrating the code.
  • illegal_language_version_override
$ dart run bin/my_app.dart
../pkg1/lib/pkg1.dart:1:1: Error: Library doesn't support null safety.
// @dart=2.9
^^^^^^^^^^^^

若要解決這些問題

  1. 檢查您從 pub.dev 安裝的任何套件是否有空值安全版本
  2. 遷移所有來源程式碼以使用健全的空值安全。

在 Dart 和 Flutter 的穩定管道中可以找到 Dart 3。若要瞭解詳情,請查看下載頁面以取得詳細資訊。若要測試您的程式碼與 Dart 3 的相容性,請使用 Dart 3 或更新版本。

$ dart --version                     # make sure this reports 3.0.0-417.1.beta or higher
$ dart pub get / flutter pub get     # this should resolve without issues
$ dart analyze / flutter analyze     # this should pass without errors

如果 pub get 步驟失敗,請檢查相依性的狀態

如果 analyze 步驟失敗,請更新您的程式碼以解決分析器列出的問題。

Dart 2.x 與空值安全

#

從 Dart 2.12 到 2.19,您需要啟用空值安全。您無法在早於 Dart 2.12 的 SDK 版本中使用空值安全。

若要啟用健全的空值安全,請將 SDK 限制下限設定為 2.12 或更新版本的語言版本。例如,您的 pubspec.yaml 檔案可能具有下列限制

yaml
environment:
  sdk: '>=2.12.0 <3.0.0'

遷移現有程式碼

#

可以遷移在沒有空值安全支援的情況下撰寫的 Dart 程式碼,以使用空值安全。我們建議使用 dart migrate 工具,該工具包含在 Dart SDK 2.12 至 2.19 版本中。

$ cd my_app
$ dart migrate

若要瞭解如何將程式碼遷移至空值安全,請查看遷移指南

哪裡可以瞭解更多資訊

#

若要深入瞭解空值安全,請查看下列資源