迁移到空安全
此页面介绍如何以及何时将您的代码迁移到 空安全。以下是迁移您拥有的每个包的基本步骤
要非正式地了解使用迁移工具的体验,请观看此视频
1. 等待迁移
#我们强烈建议按顺序迁移代码,先迁移依赖关系图的叶子节点。例如,如果包 C 依赖于包 B,而包 B 依赖于包 A,则应首先将 A 迁移到空安全,然后迁移 B,最后迁移 C。
虽然您可以迁移在您的依赖项支持空安全之前,但当您的依赖项迁移时,您可能需要更改您的代码。例如,如果您预测某个函数将接受一个可为空的参数,但该包将其迁移为不可为空,那么传递可为空的参数将成为编译错误。
本节将告诉您如何在空安全模式下借助 dart pub outdated
命令来检查和更新包的依赖项。这些说明假设您的代码在源代码控制下,以便您可以轻松撤消任何更改。
切换到 Dart 2.19.6 版本
#切换到 Dart SDK 的2.19.6 版本。这包含在 Flutter 3.7.12 SDK 中。
检查您是否拥有 Dart 2.19.6
$ dart --version
Dart SDK version: 2.19.6
检查依赖项状态
#使用以下命令获取包依赖项的迁移状态
$ dart pub outdated --mode=null-safety
如果输出表明所有包都支持空安全,那么您可以开始迁移。否则,请使用可解析列查找空安全版本(如果存在)。
以下是一个简单包的输出示例。每个包的绿色勾选标记版本都支持空安全
输出显示该包的所有依赖项都具有可解析的预发布版本,这些版本支持空安全。
如果您的任何包依赖项尚未支持空安全,我们鼓励您联系包所有者。您可以在 pub.dev 上的包页面上找到联系方式。
更新依赖项
#在迁移包的代码之前,请将其依赖项更新为空安全版本
运行
dart pub upgrade --null-safety
以升级到支持空安全的最新版本。注意:此命令将更改您的pubspec.yaml
文件。运行
dart pub get
。
2. 迁移
#您的代码需要空安全的许多更改都是很容易预测的。例如,如果一个变量可以为 null
,其类型需要 ?
后缀。如果命名参数不应该为可空,请将其标记为 required
或为其提供 默认值。
您有两个迁移选项
使用迁移工具
#迁移工具获取一个不安全的 Dart 代码包,并将其转换为空安全。您可以通过向 Dart 代码中添加 提示标记 来指导工具的转换。
在启动工具之前,请确保您已准备好
- 使用 Dart SDK 的 2.19.6 版本。
- 使用
dart pub outdated --mode=null-safety
以确保所有依赖项都是空安全的且是最新的。
通过在包含包 pubspec.yaml
文件的目录中运行 dart migrate
命令来启动迁移工具
$ dart migrate
如果您的包已准备好迁移,则工具将生成如下所示的行
View the migration suggestions by visiting:
http://127.0.0.1:60278/Users/you/project/mypkg.console-simple?authToken=Xfz0jvpyeMI%3D
在 Chrome 浏览器中访问该 URL 以查看交互式 UI,您可以在其中指导迁移过程
对于每个变量和类型注释,您都可以看到工具推断出的可空性。例如,在前面的屏幕截图中,工具推断第 1 行中的 ints
列表(以前是 int
列表)是可空的,因此应为 int?
列表。
理解迁移结果
#要查看每个更改(或不更改)的原因,请在建议的编辑窗格中单击其行号。原因将显示在编辑详细信息窗格中。
例如,考虑以下代码,来自空安全之前
var ints = const <int>[0, null];
var zero = ints[0];
var one = zero + 1;
var zeroOne = <int>[zero, one];
当此代码位于函数外部时,默认迁移(在函数内部有所不同)是向后兼容的,但不是理想的
var ints = const <int?>[0, null];
var zero = ints[0];
var one = zero! + 1;
var zeroOne = <int?>[zero, one];
通过单击第 3 行链接,您可以看到迁移工具添加 !
的原因。因为您知道 zero
不可能为 null,所以您可以改进迁移结果。
改进迁移结果
#当分析推断出错误的可空性时,您可以通过插入临时提示标记来覆盖其建议的编辑
在迁移工具的编辑详细信息窗格中,您可以使用添加
/*?*/
提示和添加/*!*/
提示按钮插入提示标记。这些按钮会立即将注释添加到您的文件中,并且没有撤消操作。如果您不想要工具插入的提示,可以使用您常用的代码编辑器将其删除。
您可以使用编辑器添加提示标记,即使工具仍在运行。因为您的代码尚未选择加入空安全,所以您无法使用新的空安全功能。但是,您可以进行不依赖于空安全功能的更改,例如重构。
编辑完代码后,点击从源代码重新运行以获取更改。
下表显示了您可以用来更改迁移工具建议的编辑的提示标记。
提示标记 | 对迁移工具的影响 |
---|---|
表达式 /!/ | 在迁移后的代码中添加一个! ,将表达式转换为其底层的非空类型。 |
类型 /!/ | 将类型标记为非空。 |
/*?*/ | 将前面的类型标记为空。 |
/*late*/ | 将变量声明标记为late ,表示它具有延迟初始化。 |
/*late final*/ | 将变量声明标记为late final ,表示它具有延迟的一次性初始化。 |
/*required*/ | 将参数标记为required 。 |
单个提示可能会在代码的其他地方产生连锁反应。在前面的示例中,在zero
被赋值的地方(第 2 行)手动添加/*!*/
标记,会使迁移工具推断zero
的类型为int
而不是int?
。此类型更改可能会影响直接或间接使用zero
的代码。
var zero = ints[0]/*!*/;
使用上述提示,迁移工具会更改其建议的编辑,如下面的代码片段所示。第 3 行不再在zero
之后有!
,并且在第 4 行中,zeroOne
被推断为int
的列表,而不是int?
。
第一次迁移 | 带有提示的迁移 |
---|---|
dart
| dart
|
选择退出文件
#虽然我们建议一次性迁移所有内容,但有时这在实践中并不可行,尤其是在大型应用程序或包中。要选择退出文件或目录,请点击其绿色复选框。稍后,当您应用更改时,每个选择退出的文件将保持不变,除了一个 2.9 版本注释。
有关增量迁移的更多信息,请参阅不安全的空安全。
请注意,只有完全迁移的应用程序和包才与 Dart 3 兼容。
应用更改
#当您喜欢迁移工具建议的所有更改时,点击应用迁移。迁移工具会删除提示标记并保存迁移后的代码。该工具还会更新 pubspec 中的最低 SDK 约束,这会使包选择加入空安全。
下一步是静态分析您的代码。如果它有效,则测试您的代码。然后,如果您已在 pub.dev 上发布了代码,则发布空安全预发布版本。
手动迁移
#如果您不想使用迁移工具,可以手动迁移。
我们建议您首先迁移叶子库——不导入包中其他文件的库。然后迁移直接依赖于叶子库的库。最后迁移具有最多包内依赖项的库。
例如,假设您有一个lib/src/util.dart
文件,它导入其他(空安全)包和核心库,但没有任何import '<local_path>'
指令。考虑首先迁移util.dart
,然后迁移仅依赖于util.dart
的简单文件。如果任何库具有循环导入(例如,A 导入 B,B 导入 C,C 导入 A),请考虑一起迁移这些库。
要手动迁移包,请按照以下步骤操作
编辑包的
pubspec.yaml
文件,将最低 SDK 约束设置为至少2.12.0
yamlenvironment: sdk: '>=2.12.0 <3.0.0'
重新生成包配置文件
$ dart pub get
使用至少
2.12.0
的较低 SDK 约束运行dart pub get
会将包中每个库的默认语言版本设置为至少 2.12,从而使它们都选择加入空安全。在您的 IDE 中打开包。
您可能会看到很多分析错误。没关系。使用分析器识别静态错误,迁移每个 Dart 文件的代码。
通过根据需要添加?
、!
、required
和late
来消除静态错误。
有关手动迁移代码的更多帮助,请参阅不安全的空安全。
3. 分析
#更新您的包(在您的 IDE 或命令行中使用dart pub get
)。然后使用您的 IDE 或命令行对您的代码执行静态分析
$ dart pub get
$ dart analyze # or `flutter analyze`
4. 测试
#如果您的代码通过了分析,请运行测试
$ dart test # or `flutter test`
您可能需要更新预期为空值的测试。
如果您需要对代码进行大量更改,则可能需要重新迁移它。如果是这样,请在再次使用迁移工具之前恢复您的代码更改。
5. 发布
#我们鼓励您在迁移后尽快发布包——可能作为预发布版本
- 设置包版本以指示重大更改。
- 更新 SDK 约束和包依赖项。
- 发布包。如果您不认为此版本是稳定版本,则将包发布为预发布版本。
更新包版本
#更新包的版本以指示重大更改
如果您的包已达到
1.0.0
或更高版本,请增加主版本。例如,如果先前版本为2.3.2
,则新版本为3.0.0
。如果您的包尚未达到
1.0.0
,则或者增加次版本或者将版本更新为1.0.0
。例如,如果先前版本为0.3.2
,则新版本为0.4.0
或1.0.0
。
检查您的 pubspec
#在发布包的稳定空安全版本之前,我们强烈建议遵循以下 pubspec 规则
- 将 Dart 最低 SDK 约束设置为您已测试过的最低稳定版本(至少
2.12.0
)。 - 使用所有直接依赖项的稳定版本。
欢迎使用空安全
#如果您走到这一步,您应该拥有一个完全迁移的、空安全的 Dart 包。
如果所有您依赖的包也已迁移,则您的程序在空引用错误方面是健全的。运行或编译代码时,您应该会看到如下输出
Compiling with sound null safety
来自所有 Dart 团队,感谢您迁移您的代码。
除非另有说明,否则本网站上的文档反映了 Dart 3.5.3。页面最后更新于 2024-08-04。 查看源代码 或 报告问题.