我有一个在null safety was introduced to Dart之前写的Flutter 翼应用程序.

我听说过Null Safety Migration Tooling.在默认情况下,我如何使用它将我的代码从NNBD之前的版本转换为不可为空的?

推荐答案

你至少需要DART 2.9.在 compose 本文时,您可以使用2.9.0-10.0.dev,即在您的pubspec.yaml中放置以下SDK约束:

environment:
  sdk: ">=2.9.0-10.0.dev <3.0.0"

Hints (/*?*/ & /*!*/)

The /*?*/ hint means that something should explicitly be nullable.
/*!*/ means that something should be non-nullable.

在使用NNBD之前,您已经可以手动添加这些提示.否则,您可以在迁移期间使用该工具添加它们(请参见下文).

编辑内容

There are ?, !, and _ edits.
? makes a type nullable after migration. _ makes it non-nullable (meaning no character is changed because non-nullable is the default).
! makes an expression non-nullable.

这些编辑可在迁移工具中预览.

Using the tool

Dart 101an nnbd_migration package.

该工具可用于100 convert code至NNBD.

我将介绍这migration steps described in the README个,并尽量简化它们:

  1. 在命令行中转到您的项目,使用flatter时运行pub getflutter pub get.(请注意,在 compose 本文时,尚未支持Flatter SDK)

  2. 100.(请注意,在 compose 本文时,我需要使用--skip-pub-outdated)

  3. 等待analysis and migration完成,然后通过打开浏览器命令行中看到的URL(格式为http://localhost:<port>/<project path>?authToken=<token>)来完成view migration suggestions.您应该会看到类似这样的内容:

    Null safety preview

  4. Select 要开始的文件.应该是这样的:

    Opened file

  5. 在右侧查看建议的编辑内容(与突出显示的字符匹配):

    Proposed edits

  6. 如果您发现您认为不正确的编辑,Edit Details中的find the root cause:

    Details

    您可以向下滚动以跟踪导致编辑建议的根表达式.当您在此过程中发现某些错误决策时,您可以按照上面的说明 Select Add /*?*/ hintAdd /*!*/ hint(您也可以在IDE中手动添加它们).

    如果是edit looks right分,你就得not need to do anything分.

  7. 你可能需要上100课很多.这将应用您添加的新提示以及您对代码所做的任何其他编辑,并生成新编辑.执行此操作,直到所有编辑看起来都正确为止.

    现在,您可能会看到提示以红色突出显示,这意味着该工具将删除提示并将其转换为?!或空白.

  8. 您可能应该在此时保存您的项目(例如,git commit).

    注意:在这一点上,您的代码添加了一系列/*?*//*!*/个提示以及has not yet been migrated个提示.

  9. 100:这将应用建议的编辑并删除所有提示.

    现在可能会让迁移工具保持打开状态.

    现在,您的代码中不再有任何提示.

  10. 测试您的项目(pub getflutter pub get,然后运行).

    如果是went wrong,那么让迁移工具保持打开状态会很有帮助. 您可能希望将版本恢复到迁移之前,然后重复这些步骤.

  11. Success!您的项目现在是空的安全??

Dart相关问答推荐

Futures 和异步代码如何在 Dart 中工作?

为什么 Dart 程序在使用词法作用域时会根据声明变量的位置而表现不同?

如何在 Dart 游戏中重复听按键?

在 Dart/Flutter 中创建 DateTime 对象时如何指定 TimeZone?

如何在 Flutter 中更改 Html 小部件中的字体样式?

自定义声音推送通知不起作用

如何编辑 Flutter 的 TextFormField 输入和 errorText 之间的间距

Flutter 在整个屏幕上禁用touch

常数在定义Flutter边缘集中的作用

Flutter 如何使用 ListTile 三行

如何突出显示所选卡片的边框?

基于镜子的反射和传统反射有什么区别?

将函数/方法分配给 Dart 中的变量

Dart 中的 final 修饰符有什么作用?

Dart 转换列表的每个元素

Dart 会在多核环境中并行执行隔离吗?

可以在 Dart 中的抽象类中声明静态方法吗?

在 Dart 中升序和降序排序?

如何使用 Dart 列出目录的内容?

在 Dart 中将类型化函数作为参数传递