健全的空值安全
Dart 語言強制執行健全的空值安全。
空值安全可防止因意外存取設為 null
的變數而導致的錯誤。
例如,如果某個方法預期是整數但收到 null
,您的應用程式就會造成執行階段錯誤。這種錯誤(空值取消參照錯誤)可能難以偵錯。
透過健全的空值安全,所有變數都需要有值。這表示 Dart 將所有變數視為「不可為空值」。您只能指派宣告類型的值,例如 int i=42
。您永遠不能將 null
值指派給預設變數類型。若要指定變數類型可以有 null
值,請在類型註解後方加上 ?
:int? i
。這些特定類型可以包含 null
或定義類型的值。
健全的空值安全將潛在的執行階段錯誤轉換為編輯時分析錯誤。使用空值安全時,如果不可為空值的變數發生以下情況,Dart 分析器和編譯器會標記出來:
- 未以不可為空值的值初始化
- 已指派
null
值。
這些檢查可讓您在部署應用程式之前修正這些錯誤。
透過範例介紹
#使用空值安全時,以下程式碼中的任何變數都不能是 null
// 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
值,只需在其類型宣告中加入 ?
即可
int? aNullableInt = null;
空值安全原則
#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
^^^^^^^^^^^^
若要解決這些問題
在 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
檔案可能具有下列限制
environment:
sdk: '>=2.12.0 <3.0.0'
遷移現有程式碼
#可以遷移在沒有空值安全支援的情況下撰寫的 Dart 程式碼,以使用空值安全。我們建議使用 dart migrate
工具,該工具包含在 Dart SDK 2.12 至 2.19 版本中。
$ cd my_app
$ dart migrate
若要瞭解如何將程式碼遷移至空值安全,請查看遷移指南。
哪裡可以瞭解更多資訊
#若要深入瞭解空值安全,請查看下列資源
除非另有說明,否則本網站上的文件反映的是 Dart 3.7.1 版本。頁面最後更新於 2024-12-10。 查看原始碼 或 回報問題。