dart-fix-static-analysis-errors について
Dart の静的解析エラーを診断し、修正するためのスキルです。Dart 開発者向けに、解析コマンド、null 安全性や型の修正、設定、再検証の手順を案内します。
主な機能
- 01Dart の解析診断を実行
- 02自動修正の適用と確認
- 03null 安全性と型の問題を修正
- 04厳格な解析ルールを設定
- 05テストで修正を検証
活用シーン
- 01Dart コードの警告を調査
- 02nullable フィールドの型昇格エラーを修正
- 03ジェネリック型の明示を徹底
- 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で変更をプレビューしてください。
Null 安全性と型解決
Dart の健全な Null 安全性と厳密な型システムに関連する静的エラーに対処します。
- Null 許容性: 型に
?を追加して、nullを明示的に許容します(例:String?)。 - アサーション: null 許容式が null ではないと保証できる場合は、後置のバング演算子
!を使って、基になる null 非許容型にキャストします。 - 遅延初期化: 初回読み取り前に必ず初期化されるトップレベル変数またはインスタンス変数には、
late修飾子を適用します。これにより、アナライザーの確定的な代入チェックを回避できます。 - 名前付きパラメーター: デフォルト値がなく、null も許容できない名前付きパラメーターには、
required修飾子を使います。 - 明示的なダウンキャスト: 静的解析で暗黙的なダウンキャストが許可されない場合(例:
List<Animal>をList<Cat>に代入する場合)は、明示的なキャストas List<Cat>を使います。 - ジェネリック型: ジェネリッククラスには、常に明示的な型注釈を指定します(例:
List<String>、Map<String, dynamic>)。デフォルトでdynamicとなる、型引数のないListやMapは避けてください。
フロー解析と型の昇格
Dart の制御フロー解析を活用し、手動でキャストすることなく、null 許容型を null 非許容型に安全に昇格させます。
- Null チェック: ローカル変数が
nullかどうかを確認します(例:if (value != null))。そのブロック内では、型が自動的に null 非許容型に昇格します。 - 型テスト:
is演算子(例:if (value is String))を使って、変数を特定のサブクラスまたは型に昇格させます。 - 早期リターン: 変数が null の場合、または型が異なる場合は、早期リターン、
break、throwを使って制御フローの経路を抜けます。これにより、スコープの残りの部分では、アナライザーが変数の型を昇格させます。 - 到達可能性: 常に例外をスローするかプロセスを終了する関数には、
Never型を使います。アナライザーはこれを使って、到達不能なコード経路を判定します。
アナライザーの設定
パッケージのルートにある analysis_options.yaml ファイルを設定して、型チェックを厳格化し、リンターのルールをカスタマイズします。
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を追加して、サウンド Null Safety を一時的に無効にします。 - フィールドがプライベートで final の場合: フロー解析による型の昇格を利用します。
- フィールドがパブリックまたは final でない場合: フロー解析では型を昇格できません。フィールドをローカル変数にコピーし、そのローカル変数が null かどうかを確認してから使用します。
フィードバックループ
- バリデーターを実行:
$ dart analyze - エラーを確認: ファイル、行番号、診断コードを特定します。
- 修正: 適切な Null Safety または型解決の修正を適用します。
- 繰り返し:
$ dart analyzeが「No issues found!」を返すまで続けます。
例
ローカル変数への代入による型の昇格
null 許容のインスタンスフィールドを扱う場合は、フロー解析を有効にするためにローカル変数にコピーします。
誤り(解析に失敗):
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 対応