健全的空安全
Dart 語言強制執行健全的空安全。
空安全可以防止因意外訪問設定為 null 的變數而導致的錯誤。
例如,如果一個方法期望一個整數但接收到 null,你的應用就會導致執行時錯誤。這種錯誤(空解引用錯誤)可能很難除錯。
透過健全的空安全,所有變數都需要一個值。這意味著 Dart 將所有變數視為不可為空。你只能賦宣告型別的值,例如 int i=42。你永遠不能將 null 值賦給預設變數型別。要指定變數型別可以具有 null 值,請在型別註解後新增 ?:int? i。這些特定型別可以包含 null 或定義型別的值。
健全的空安全將潛在的執行時錯誤轉變為編輯時分析錯誤。藉助空安全,如果不可為空的變量出現以下情況,Dart 分析器和編譯器會進行標記:
- 未用非 null 值初始化
- 已分配
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 一個變數可以為 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_overridedart run bin/my_app.dart
../pkg1/lib/pkg1.dart:1:1: Error: Library doesn't support null safety.
// @dart=2.9
^^^^^^^^^^^^要解決這些問題:
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 檔案可能具有以下約束:
environment:
sdk: '>=2.12.0 <3.0.0'遷移現有程式碼
#未支援空安全編寫的 Dart 程式碼可以遷移為使用空安全。我們建議使用 Dart SDK 2.12 到 2.19 版本中包含的 dart migrate 工具。
cd my_app
dart migrate要了解如何將程式碼遷移到空安全,請檢視遷移指南。
瞭解更多
#要了解有關空安全的更多資訊,請檢視以下資源: