声音零安全性

Last updated: ... / Reads: 40 Edit

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

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

例如,如果某个方法需要整数但收到 null ,则您的应用会导致运行时错误。这种类型的错误(空取消引用错误)可能很难调试。

凭借健全的 null 安全性,所有变量都需要一个值。这意味着 Dart 认为所有变量都不可为空。您只能分配声明类型的值,例如 int i=42 。您永远不能将 null 值分配给默认变量类型。要指定变量类型可以具有 null 值,请在类型注释后添加 ? : int? i 。这些特定类型可以包含 null 或定义类型的值。

健全的空安全将潜在的运行时错误转变为编辑时分析错误。借助 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 ,只需将 ? 添加到其类型声明中:

https://dart.dev/null-safety#:~:text=int%3F%20aNullableInt%20%3D%20null%3B
  • 要尝试交互式示例,请参阅空安全代码实验室。
  • 要了解有关此主题的更多信息,请参阅了解 null 安全性。

零安全原则

Dart 使用以下两个核心设计原则支持空安全:

  • 默认情况下不可为空。除非您明确告诉 Dart 变量可以为 null,否则它被视为不可为 null。研究发现非空是迄今为止 API 中最常见的选择,因此选择了此默认值。
  • 完全健全。 Dart 的 null 安全性很健全,可以实现编译器优化。如果类型系统确定某事物不为空,那么该事物永远不会为空。一旦将整个项目及其依赖项迁移到零安全性,您就可以获得健全性的全部好处——不仅错误更少,而且二进制文件更小,执行速度更快。

Dart 3 和空安全

Dart 3 具有内置的健全的 null 安全性。 Dart 3 会阻止没有它的代码运行。

要了解如何迁移到 Dart 3,请查看 Dart 3 迁移指南。在解决依赖关系时,没有空安全支持的开发包会导致问题:

dart pub get

Because pkg1 doesn't support null safety, version solving failed.
=2.9.0 <3.0.0'" must be 2.12.0 or higher to enable null safety.

与 Dart 3 不兼容的库会导致分析或编译错误。

 dart analyze .
Analyzing ....                         0.6s

=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 安装的任何软件包的 null 安全版本
  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 版本中使用空安全。

要启用健全的 null 安全性,请将 SDK 约束下限设置为 2.12 或更高版本的语言版本。例如,您的 pubspec.yaml 文件可能具有以下限制:

environment:
  sdk: '>=2.12.0 <3.0.0'

迁移现有代码

警告:Dart 3 删除了 dart migrate 工具。如果您在迁移代码时需要帮助,请使用 2.19 SDK 运行该工具,然后升级到 Dart 3。 您可以在没有该工具的情况下进行迁移,但它涉及手动编辑代码。

不支持空安全性编写的 Dart 代码可以迁移到使用空安全性。我们建议使用 Dart SDK 版本 2.12 至 2.19 中包含的 dart migrate 工具。

 cd my_app
 dart migrate

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

哪里可以了解更多信息

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

  • 空安全代码实验室
  • 了解零安全性
  • 现有代码的迁移指南
  • 空安全常见问题解答
  • 空安全示例代码

Comments

Make a comment