【发布时间】:2020-09-20 17:47:33
【问题描述】:
我有一个在null safety was introduced to Dart 之前编写的 Flutter 应用程序。
我听说过 Null 安全迁移工具。我如何使用它将我的代码从 pre-NNBD 默认转换为不可为空?
【问题讨论】:
我有一个在null safety was introduced to Dart 之前编写的 Flutter 应用程序。
我听说过 Null 安全迁移工具。我如何使用它将我的代码从 pre-NNBD 默认转换为不可为空?
【问题讨论】:
你至少需要 Dart 2.9。在撰写本文时,您可以使用 2.9.0-10.0.dev,即将以下 SDK 约束放入您的 pubspec.yaml:
environment:
sdk: ">=2.9.0-10.0.dev <3.0.0"
/*?*/ & /*!*/)/*?*/ 提示意味着某些东西应该显式地为空。 /*!*/ 表示某些东西应该是不可为空的。
您可以在使用 NNBD 之前手动添加这些提示。否则,您可以在迁移期间使用工具添加它们(见下文)。
有?、! 和_ 编辑。 ? 在迁移后使类型可为空。 _ 使其不可为空(意味着没有任何字符被更改,因为不可为空是默认值)。 ! 使表达式不可为空。
这些修改会在迁移工具中预览。
Dart 2.9 自带an nnbd_migration package。
此工具可用于以交互方式将代码转换为 NNBD。
我将覆盖migration steps described in the README 并尝试简化它们:
使用 Flutter 时,在命令行中转到您的项目并运行 pub get 或 flutter pub get。 (请注意,在撰写本文时,Flutter SDK 尚不支持)
运行 dart migrate。 (请注意,在撰写本文时,我需要使用--skip-pub-outdated)
等待分析和迁移完成,然后通过在浏览器的命令行中打开您在命令行中看到的 URL(格式为 http://localhost:<port>/<project path>?authToken=<token>)查看迁移建议。您应该会看到如下内容:
选择一个文件开始。它应该看起来像这样:
在右侧查看建议的修改(匹配突出显示的字符):
如果您发现您认为不正确的编辑,请在编辑详情中找出根本原因:
您可以向下滚动以跟踪导致修改提议的根表达式。当您在途中发现某个错误的决定时,您可以Add /*?*/ hint 或Add /*!*/ hint,如上所述(您也可以在 IDE 中手动添加它们)。
如果编辑看起来正确,您确实不需要做任何事情。
您可能需要 Rerun From Sources 很多。这将应用您添加的新提示以及您对代码所做的任何其他编辑并生成新的编辑。执行此操作,直到所有编辑看起来都正确为止。
现在,您可能会看到提示以红色突出显示,这意味着该工具将删除提示并将其转换为 ?、! 或空白。
此时您可能应该保存您的项目(例如git commit)。
注意:此时,您的代码添加了一堆 /*?*/ 和 /*!*/ 提示,尚未迁移。
Apply Migration:这将应用建议的编辑并删除所有提示。
现在可能让迁移工具保持打开状态。
现在,您的代码中不再有任何提示。
测试您的项目(pub get 或 flutter pub get 然后运行)。
如果出现问题出错,让迁移工具保持打开状态会很有帮助。 您可能希望将您的版本恢复到迁移之前的版本并重复这些步骤。
成功!你的项目现在是空安全的??
【讨论】:
Analyzing project... 8.5s No analysis issues found. Generating migration suggestions... -encountered error: Exception while running dartfix: Bad state: Analysis seems to have an SDK without NNBD enabled. - 这是什么意思?我有Dart 2.9.0 (build 2.9.0-8.0.dev 和environment: sdk: ">=2.9.0 <3.0.0"