跳到主要内容

健全的空安全

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

要了解如何将代码迁移到空安全,请查看迁移指南

了解更多

#

要了解有关空安全的更多信息,请查看以下资源: