mcpField
D
dart-fix-static-analysis-errors

dart-fix-static-analysis-errors

github.com/dart-lang测试与质量532249 次安装2 周前更新
代码仓库

关于 dart-fix-static-analysis-errors

用于诊断和修复 Dart 静态分析问题的实用技能,面向 Dart 开发者,涵盖分析器命令、空安全与类型修正、配置及验证流程。

主要功能

  1. 01运行 Dart 分析诊断
  2. 02应用或预览自动修复
  3. 03处理空安全与类型问题
  4. 04配置严格分析规则
  5. 05通过测试验证修复

适用场景

  1. 01排查 Dart 代码警告
  2. 02修复可空字段提升错误
  3. 03要求泛型显式声明类型
  4. 04发布前检查修复结果

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/dart-lang/skills --skill dart-fix-static-analysis-errors

安装后在 Claude Code 中输入/dart-fix-static-analysis-errors确认已加载。

详细介绍

解决 Dart 静态分析错误

目录

诊断执行

运行 Dart 分析器,识别代码库中的静态错误、警告和信息级诊断。

  • 运行 $ dart analyze,分析当前目录中的所有 Dart 文件。
  • 在命令后附加路径,以指定目录或文件:$ dart analyze bin 或 $ dart analyze lib/main.dart。
  • 使用 --fatal-infos 标志,将信息级问题也视为失败,以加强检查。
  • 使用 $ dart fix --apply 自动应用受支持诊断的快速修复。先使用 $ dart fix --dry-run 预览更改。

空安全与类型解析

解决与 Dart 健全空安全和严格类型系统相关的静态错误。

  • 可空性: 在类型后附加 ?,明确允许 null(例如,String?)。
  • 断言: 如果能确保表达式不为 null,可使用后缀感叹号运算符 !,将可空表达式转换为其对应的非空类型。
  • 延迟初始化: 对保证在首次读取前初始化的非空顶层变量或实例变量使用 late 修饰符,从而绕过分析器的确定赋值检查。
  • 命名参数: 对没有默认值且不能为 null 的命名参数使用 required 修饰符。
  • 显式向下转型: 如果静态分析不允许隐式向下转型(例如,将 List<Animal> 赋值给 List<Cat>),请使用显式转换:as List<Cat>。
  • 泛型类型: 始终为泛型类提供显式类型注解(例如,List<String>、Map<String, dynamic>)。避免使用默认类型为 dynamic 的原始 List 或 Map。

流程分析与类型提升

利用 Dart 的控制流分析,在不手动转换的情况下,安全地将可空类型提升为非空类型。

  • 空值检查: 检查局部变量是否为 null(例如,if (value != null)),即可在该代码块中自动将其提升为非空类型。
  • 类型测试: 使用 is 运算符(例如,if (value is String)),将变量提升为特定子类或类型。
  • 提前返回: 如果变量为 null 或类型不正确,可使用提前返回、break 或 throw 退出控制流路径。分析器会在该作用域的剩余部分提升变量类型。
  • 可达性: 对于无条件抛出异常或终止进程的函数,使用 Never 类型。分析器会据此判断不可达代码路径。

分析器配置

在包根目录的 analysis_options.yaml 文件中配置更严格的类型检查,并自定义 lint 规则。

  • 启用 strict-casts: true,防止从 dynamic 隐式向下转型。
  • 启用 strict-inference: true,防止分析器在无法推断类型时回退到 dynamic。
  • 启用 strict-raw-types: true,要求为泛型类型显式指定类型参数。
  • 使用 // ignore_for_file: <diagnostic_name> 在文件中抑制特定诊断。
  • 使用 // ignore: <diagnostic_name> 在特定行抑制诊断。

工作流:静态分析问题修复

按照以下顺序工作流,解决 Dart 项目中的静态分析错误。

任务进度清单

复制此清单以跟踪进度:

  • 运行 $ dart analyze,以确定错误基线。
  • 运行 $ dart fix --apply,自动修复可修复的问题。
  • 处理剩余的 Null Safety 错误(?、!、late、required)。
  • 处理剩余的类型系统错误(显式 as 转换、泛型类型注解)。
  • 运行 $ dart analyze,确认所有错误均已解决。
  • 执行测试或运行应用,确保修复未引入运行时异常(例如,as 转换失败或 late 变量未初始化)。
条件逻辑
  • 如果正在处理混合版本代码(旧版 Dart 2.9): 通过向 dart run 或 flutter run 传递 --no-sound-null-safety,或在入口文件顶部添加 // @dart=2.9,暂时禁用健全空安全。
  • 如果字段是私有且为 final: 依赖流程分析进行类型提升。
  • 如果字段是公共或非 final: 流程分析无法提升其类型。先将字段复制到局部变量,检查局部变量是否为 null,然后使用该局部变量。
反馈循环
  1. 运行验证器: $ dart analyze
  2. 检查错误: 找出文件、行号和诊断代码。
  3. 修复: 应用适当的空安全或类型解析修复。
  4. 重复: 持续修复,直到 $ dart analyze 返回“未发现问题!”。

示例

通过局部变量赋值进行类型提升

处理可空实例字段时,将其复制到局部变量,以启用流程分析。

错误(分析失败):

class Coffee {
  String? _temperature;

  void checkTemp() {
    if (_temperature != null) {
      // ERROR: Property cannot be promoted because it is not a local variable.
      print(_temperature.length); 
    }
  }
}

正确:

class Coffee {
  String? _temperature;

  void checkTemp() {
    final temp = _temperature; // Copy to local variable
    if (temp != null) {
      // SUCCESS: 'temp' is promoted to non-nullable String.
      print(temp.length); 
    }
  }
}
严格的分析器配置

采用以下 analysis_options.yaml,以强制执行严格的类型安全。

include: package:lints/recommended.yaml

analyzer:
  language:
    strict-casts: true
    strict-inference: true
    strict-raw-types: true
  errors:
    invalid_assignment: error
    missing_return: error
    dead_code: info

评论

支持 Markdown