目录

健全的空安全

Dart语言强制执行健全的空安全。

空安全可防止因意外访问设置为 null 的变量而导致的错误。

例如,如果一个方法期望一个整数但接收到了 null ,你的应用程序将会导致运行时错误。这种类型的错误,即空解引用错误,很难调试。

使用健全的空安全,所有变量都需要一个值。这意味着Dart认为所有变量都是 不可空的 。你只能赋值声明类型的变量,例如 int i=42 。你永远不能为默认变量类型赋值 null 。要指定变量类型可以具有 null 值,在类型注解后添加 ?int? i 。这些特定类型可以包含 null 定义类型的变量。

健全的空安全将潜在的 运行时错误 转换为 编辑时 分析错误。使用空安全,Dart分析器和编译器会标记不可空变量是否:

  • 未初始化为非空值
  • 已赋值为 null 值。

这些检查允许你在部署应用程序 之前 修复这些错误。

通过示例介绍

#

使用空安全,以下代码中的任何变量都不能为 null

dart
// 使用空安全,这些变量永远不会为 null。
var i = 42; // 推断为 int 类型。
String name = getFileName();
final b = Foo();

要指示变量可能具有 null 值,只需在其类型声明中添加 ?

dart
int? aNullableInt = null;
  • 要尝试一些交互式示例,请尝试 Dart速查表 中一些面向空安全的示例。
  • 要了解更多关于空安全的信息,请查看 理解空安全

空安全原则

#

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
^^^^^^^^^^^^

要解决这些问题:

  1. 检查你从 pub.dev 安装的任何包的 空安全版本
  2. 将你的所有源代码 迁移 为使用健全的空安全。

Dart 3 可以在 Dart 和 Flutter 的稳定渠道中找到。要了解更多信息,请查看 下载页面 了解详情。要测试你的代码与 Dart 3 的兼容性,请使用 Dart 3 或更高版本。

$ dart --version                     # 确保这报告 3.0.0-417.1.beta 或更高版本
$ dart pub get / flutter pub get     # 这应该没有问题地解析
$ dart analyze / flutter analyze     # 这应该通过而没有错误

如果 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 migrate 工具,该工具包含在 Dart SDK 版本 2.12 到 2.19 中。

$ cd my_app
$ dart migrate

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

了解更多信息

#

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