如何将 Dart 代码迁移到不可为空 (NNBD)?

cre*_*not 11 dart flutter

我有一个 Flutter 应用程序,它是在空安全引入 Dart之前编写的。

我听说过Null Safety Migration Tooling并想知道如何使用它将我的代码从 NNBD 之前的代码默认转换为不可为空。

cre*_*not 14

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

environment:
  sdk: ">=2.9.0-10.0.dev <3.0.0"
Run Code Online (Sandbox Code Playgroud)

提示 ( /*?*/& /*!*/)

/*?*/提示手段的东西应该明确的可为空
/*!*/意味着某些东西应该是不可为空的

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

编辑

还有?!_编辑。在迁移后
?使类型可以为_使其不可为空(意味着没有字符被更改,因为不可为空是默认值)。
!使表达式不可为空

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

使用工具

Dart2.9带有一个nnbd_migration
此工具可用于将代码交互转换为 NNBD。

我将介绍自述文件中描述迁移步骤并尝试简化它们:

  1. 在命令行中转到您的项目并运行pub getflutter pub get在使用 Flutter 时。(请注意,在撰写本文时,尚不支持 Flutter SDK)
  2. 运行dart migrate。(请注意,在撰写本文时,我需要使用--skip-pub-outdated
  3. 等待分析和迁移完成,然后通过打开您在浏览器(格式)的命令行中看到的 URL 来查看迁移建议http://localhost:<port>/<project path>?authToken=<token>。您应该会看到如下内容:

空安全预览

  1. 选择一个文件开始。它应该是这样的:

打开的文件

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

建议的编辑

  1. 如果您发现您认为不正确的编辑,请在Edit Details 中找到根本原因

细节

您可以向下滚动以跟踪导致编辑建议的根表达式。当您在此过程中的某处发现一些错误的决定时,您可以Add /*?*/ hintAdd /*!*/ hint如上所述(您也可以在您的 IDE 中手动添加它们)。

如果编辑看起来正确,则无需执行任何操作

  1. 你可能需要Rerun From Sources很多。这将应用您添加的新提示以及您对代码所做的任何其他编辑,并生成新的编辑。这样做直到所有编辑看起来都正确。

    现在,你可能会看到提示以红色突出显示,这意味着该工具将删除的提示,并转换到任何一个?!或空白。

  2. 此时您可能应该保存您的项目(例如git commit)。

    注意:此时,您的代码有一堆添加/*?*//*!*/提示,尚未迁移

  3. Apply Migration:这将应用建议的编辑并删除所有提示。可能暂时让迁移工具保持打开状态。

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

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

    如果出现问题,让迁移工具保持打开状态会很有帮助。
    您可能希望将版本恢复到迁移之前并重复这些步骤。

  5. 成功!您的项目现在是空安全的

  • @pskink 当前在为 Flutter 项目运行它时会发生这种情况。我应该提到的是,在撰写本文时,Flutter 尚不支持它(Flutter SDK 尚未启用 NNBD)。 (2认同)