声音空安全
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();
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 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 migrate
工具,该工具包含在 Dart SDK 版本 2.12 到 2.19 中。
$ cd my_app
$ dart migrate
要了解如何将代码迁移到空安全,请查看 迁移指南。
更多学习资源
#要详细了解空安全,请查看以下资源
除非另有说明,否则本网站上的文档反映了 Dart 3.5.3。页面最后更新于 2024-06-10。 查看源代码 或 报告问题。