內容

健全的空值安全性

Dart 語言強制執行嚴謹的 Null 安全。

Null 安全性可防止因意外存取設定為 null 的變數而產生的錯誤。

例如,如果方法預期會收到整數,但收到 null,您的應用程式會導致執行時期錯誤。這種類型的錯誤,也就是 null 參考錯誤,可能會很難除錯。

使用健全的 null 安全性,所有變數都需要一個值。這表示 Dart 會將所有變數視為不可為 null。您只能指定已宣告類型的值,例如 int i=42。您永遠無法將 null 值指定給預設變數類型。若要指定變數類型可以有 null 值,請在類型註解後加上 ?int? i。這些特定類型可以包含 null 已定義類型的值。

健全的 null 安全性會將潛在的執行時期錯誤轉換為編輯時期分析錯誤。有了 null 安全性,Dart 分析器和編譯器會標示出不可為 null 的變數是否

  • 尚未初始化為非 null 值
  • 已指定為 null 值。

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

透過範例進行介紹

#

有了 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;

Null 安全原則

#

Dart 使用下列兩個核心設計原則支援 null 安全性

  • 預設不可為 null。除非您明確告知 Dart 變數可以為 null,否則會視為不可為 null。在研究發現非 null 是 API 中最常見的選項後,選擇了這個預設值。

  • 完全健全。Dart 的 null 安全性是健全的,這能啟用編譯器最佳化。如果類型系統判定某個項目不為 null,則該項目永遠不會為 null。一旦您將整個專案及其相依性移轉到 null 安全性,您便能獲得健全性的所有好處,不只錯誤減少,而且二進位檔會更小,執行速度也會更快。

Dart 3 和 Null 安全

#

Dart 3 內建健全的 null 安全性。Dart 3 會阻止沒有健全 null 安全性的程式碼執行。

若要了解如何移轉至 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 3 可在 Dart 和 Flutter 的穩定頻道中找到。若要深入了解,請查看 下載頁面 以取得詳細資訊。若要測試您的程式碼是否相容於 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 和 Null 安全

#

從 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 SDK 版本 2.12 到 2.19 中包含的 dart migrate 工具。

$ cd my_app
$ dart migrate

若要了解如何將您的程式碼移轉至空安全性,請查看 移轉指南

進一步學習的地方

#

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