跳到主要內容

健全的空安全

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

空安全可以防止因意外訪問設定為 null 的變數而導致的錯誤。

例如,如果一個方法期望一個整數但接收到 null,你的應用就會導致執行時錯誤。這種錯誤(空解引用錯誤)可能很難除錯。

透過健全的空安全,所有變數都需要一個值。這意味著 Dart 將所有變數視為不可為空。你只能賦宣告型別的值,例如 int i=42。你永遠不能將 null 值賦給預設變數型別。要指定變數型別可以具有 null 值,請在型別註解後新增 ?int? i。這些特定型別可以包含 null 定義型別的值。

健全的空安全將潛在的執行時錯誤轉變為編輯時分析錯誤。藉助空安全,如果不可為空的變量出現以下情況,Dart 分析器和編譯器會進行標記:

  • 未用非 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;
  • 要嘗試一些互動式示例,請檢視 Dart 速查表 中一些面向空安全的示例。
  • 要了解有關空安全的更多資訊,請檢視 理解空安全

空安全原則

#

Dart 使用以下兩個核心設計原則支援空安全:

預設不可為空
除非你明確告訴 Dart 一個變數可以為 null,否則它將被視為不可為空。選擇此預設值是因為研究發現,在 API 中非 null 是迄今為止最常見的選擇。
完全健全
Dart 的空安全是健全的。如果型別系統確定變數或表示式具有不可為空的型別,則保證它在執行時永遠不會評估為 null

全程式健全的空安全使 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 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 與空安全

#

從 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

要了解如何將程式碼遷移到空安全,請檢視遷移指南

瞭解更多

#

要了解有關空安全的更多資訊,請檢視以下資源: