Flutter中批量应用修复措施的方法介绍

440 阅读6分钟

一步到位地修复多个分析问题

分析问题的快速修复中,我们看了对编辑时自动修复单个诊断的支持。有时,即使这样做也太慢了,你真的想一次修复多个诊断。幸运的是,也有对这个问题的支持,我们在这篇文章中介绍。

有几种方法可以修复多个诊断,这取决于你想修复多少个诊断,我们将分别讨论每一种。

修复同一诊断程序的多次出现

你是否曾经通过把一个类移到不同的文件来重构你的代码?如果是这样的话,很可能有些导入只是因为被移动的类中的引用而需要,这就给你留下了未使用的导入。

Visual Studio Code

IntelliJ IDEA

对于任何可以在同一文件中应用不止一次的修正,工具提供了一个选项,可以在文件中的任何地方应用它。

这些修正显示在与其他修正相同的地方,并且通常与单一位置的修正有类似的标签,但添加了一些类似 "文件中 "的短语。例如,下面是这个修正在你的IDE中的显示方式。

Visual Studio Code

IntelliJ IDEA

选择 "文件内 "修复的作用正是你所期望的--它删除了文件中所有未使用的导入。

Visual Studio Code

IntelliJ IDEA

修复一个文件中的所有诊断程序

这很好,但它只修复了一种诊断,而且需要你找到诊断被报告的地方(无论是在编辑器中还是在问题视图中)来调用该修复。看起来这个工具可以做得更多。

而在Visual Studio Code中,它可以。你可以在一个文件中应用所有诊断的修复。为了了解如何做,我们将使用与上面相同的例子。

如果你右击打开上下文菜单,你会看到以下内容。

如果你选择**Source Action...,**它会打开第二个菜单。

选择 "全部修复 "会导致修复被应用于编辑器中的所有诊断,产生以下结果。

你也可以从命令调色板中调用全部修复命令,你可以从查看菜单中选择命令调色板 ...,或者使用键盘快捷键(任何平台上的F1,Windows和Linux上的Control+Shift+P,或者macOS上的Command+Shift+P)来打开。你可以通过输入命令的名称来过滤列表。命令调色板看起来像这样。

修复一个目录中的所有诊断程序

我们拥有的最完整的修复诊断的工具是dart fix命令行工具。它可以修复给定目录中的所有诊断,这意味着你可以用它来修复软件包或应用程序中的所有诊断。

当然,有几个注意事项。它不能修复每一个诊断,因为它应用的是与IDE中相同的快速修复方法,而不是每一个诊断都有快速修复方法。当有多种同样有效的修复方法时,它也不会对诊断进行快速修复,因为它不知道你喜欢应用哪种修复方法。这些注意事项也适用于上一节所述的 "全部修复"命令。

虽然对这个工具的需求并不经常出现(这是你可能不知道它的一个原因),但在一些情况下它特别有用。

首先,考虑一下你想启用一个新的林特,甚至一组林特的情况,比如核心推荐飘忽不定的规则集之一。很有可能在你的软件包中至少有一些违反lint规则的情况。如果有一个与lint相关的修复,那么就可以在一个步骤中把这个修复应用到所有地方,而不是把修复应用到每个违规行为上。

第二,考虑你从一个Flutter版本更新到另一个版本的情况。如果两个版本之间的API发生了变化,很有可能有一个修复程序来升级你的代码以符合最新的版本。同样,如果所有这些变化都在一个单一的操作中应用,那就很方便了。

这就是dart fix命令的用处。它可以对多个文件中的多个诊断程序进行快速修复。

该命令有两种模式。干运行 模式告诉你它可以应用多少变化,可以修复哪些诊断,但不修改任何文件。应用 模式则是应用这些变化。

你可以提供包含要修复的文件的目录的路径,但是如果你省略了目录,它会递归地修复当前目录及其子目录中的所有文件。

让我们假设你已经启用了 prefer_single_quotes lint,并且你有一个包含以下内容的文件。

import 'package:logging/logging.dart';
void main() {
  var logger = Logger("myApp");
  logger.info("Entering myApp");
  // Do stuff.
  logger.info("Exiting myApp");
}

在包含该文件的目录中,用--干运行选项运行dart fix命令,会产生以下输出。

$ dart fix --dry-run
Computing fixes in __bin__ (dry run)... 4.3s
3 proposed fixes in 1 file.
demo.dart
  prefer_single_quotes • 3 fixes

该工具发现了三个违反lint的情况,并报告说它能够修复所有这三个情况,但它没有修改该文件。

再次运行dart fix工具,但这次使用了--apply选项,产生了几乎相同的输出。

$ dart fix --apply
Computing fixes in __bin__... 5.3s
Applying fixes...         0.0s
3 proposed fixes in 1 file.
demo.dart
  prefer_single_quotes • 3 fixes
3 fixes made in 1 file.

但是这一次,文件被更新为包含以下内容。

import 'package:logging/logging.dart';
void main() {
  var logger = Logger('myApp');
  logger.info('Entering myApp');
  // Do stuff.
  logger.info('Exiting myApp');
}

因为dry-run模式不会产生任何类型的diff输出,使你能够看到实际的修改建议,考虑在使用 --apply选项 运行工具之前提交你的修改 。这样就可以更容易地看到工具实际做了哪些修改,并恢复你不喜欢的任何修改。

如果你不想在运行工具之前提交,并且你使用IntelliJ IDEA,你可以使用文件->本地历史功能来比较应用修复之前和之后的状态。(更多信息请看为特定状态添加标签的本地历史)。

dart修复命令不可能修复所有的问题,但是当它可以修复时,它比在所有地方手动应用修复要容易得多。

总结

能够在一次操作中应用多个修复,不仅增加了快速修复的力量,而且可能使其更容易进行更大规模的修改,如启用新的lint规则或升级到最新版本的Flutter。

一如既往,如果你有关于如何改进这些工具的想法,请通过创建一个dart-lang/sdk问题让我们知道。