mcpField
D
dart-fix-runtime-errors

dart-fix-runtime-errors

github.com/flutter開発3.1k14.9k 回インストール2 日前に更新
リポジトリ

dart-fix-runtime-errors について

Dart の静的解析エラーを診断・修正するためのスキルです。型安全性、null 安全性、例外処理を扱い、解析とテストによる確認手順を示します。

主な機能

  1. 01型システムとジェネリクスの指針
  2. 02null 安全性エラーの解決
  3. 03例外処理の原則
  4. 04解析器と dart fix の手順
  5. 05テストによる修正確認

活用シーン

  1. 01Dart プロジェクトの解析エラー修正
  2. 02null と型の不一致への対処
  3. 03オーバーライドと実行時キャスト失敗の確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/flutter/agent-plugins --skill dart-fix-runtime-errors

インストール後、Claude Code で/dart-fix-runtime-errorsを入力して読み込まれたか確認します。

詳細

Dart 静的解析エラーの解決

目次

基本概念とガイドライン

型システムと健全性

Dart の健全な型システムを適用し、実行時に無効な状態になるのを防ぎます。

  • メソッドのオーバーライド: 戻り値の型(共変)とパラメーターの型(反変)の健全性を維持します。covariant キーワードが明示的に付けられていない限り、サブクラスでパラメーターの型をより制約の強い型に変更しないでください。
  • ジェネリクスとコレクション: ジェネリッククラスには明示的な型注釈を追加します(例:List<T>、Map<K, V>)。List<dynamic> を型付きリスト(例:List<Cat>)に代入しないでください。
  • ダウンキャスト: dynamic からの暗黙的なダウンキャストは避けます。必要に応じて明示的なキャスト(例:as List<Cat>)を使用します。ただし、TypeError の例外を防ぐため、実行時の実際の型が一致していることを確認してください。
  • 厳密なキャスト: analysis_options.yaml の analyzer: language: の下で strict-casts: true を有効にし、明示的なキャストを必須にするとともに、コンパイル時に暗黙的なダウンキャストのエラーを検出します。
ヌル安全性

変数の初期化と null 許容性を適切に管理し、ヌル安全性に関連する静的エラーを解消します。

  • 修飾子: null 許容型には ?、null アサーションには !、null を許容しない名前付きパラメーターには required を適用します。
  • 遅延初期化: 使用前に必ず初期化される非 null 許容変数には late キーワードを使用します。特に、Dart の制御フロー解析で初期化を確実に証明できないトップレベル変数やインスタンス変数に適用します。
  • ワイルドカード: 変数を束縛しないローカル変数やパラメーターには _ ワイルドカード変数(Dart 3.7+)を使用し、未使用変数の警告を回避します。
エラー処理

回復可能な例外と回復不能なエラーを区別します。

  • キャッチ: 回復可能な失敗については、Exception のサブタイプをキャッチします。
  • エラー: Error やそのサブタイプ(例:TypeError、ArgumentError)を明示的にキャッチしないでください。エラーは修正すべきプログラミング上のバグであり、キャッチするものではありません。avoid_catching_errors リンタールールを有効にして、これを徹底します。
  • 再スロー: 例外の元のスタックトレースを保持したまま伝播させるには、catch ブロック内で rethrow を使用します。

ワークフロー

ワークフロー:静的解析エラーの解決

Dart プロジェクトの静的解析エラーを特定、修正、検証するには、この順次ワークフローを使用してください。進捗を記録するため、チェックリストをコピーしてください。

タスクの進捗:

  • 1. 静的解析を実行します。
  • 2. 自動修正を適用します。
  • 3. 残りのエラーを手動で解決します。
  • 4. 修正を検証します(フィードバックループ)。

1. 静的解析を実行します Dart アナライザーを実行して、対象のディレクトリまたはファイルにあるすべての静的エラーを特定します。

dart analyze . --fatal-infos

2. 自動修正を適用します dart fix ツールを使用して、標準的な lint と解析の問題を自動的に解決します。

# Preview changes
dart fix --dry-run
# Apply changes
dart fix --apply

3. 残りのエラーを手動で解決します アナライザーに残った出力を確認し、エラーの種類に応じた条件分岐で対応します。

  • エラーが Null Safety の問題の場合(例:「Property cannot be accessed on a nullable receiver」):
    • その変数が論理的に null になり得るか確認します。
    • null になり得る場合は、オプショナルチェーン(?.)を使用するか、フォールバック(??)を指定します。
    • null になり得ず、別の場所で初期化が保証されている場合は、宣言に late を付けます。
  • エラーが型の不一致の場合(例:「The argument type 'List' can't be assigned...」):
    • その変数の初期化をたどります。
    • インスタンス化に明示的なジェネリック型の注釈を追加します(例:[] ではなく <int>[])。
  • エラーが無効なオーバーライドの場合(例:「The parameter type doesn't match the overridden method」):
    • スーパークラスに一致するようにパラメーター型を広げるか、
    • ドメインロジック上、意図的に型を狭める必要がある場合は、パラメーターに covariant キーワードを追加します。

4. 修正を検証します(フィードバックループ) バリデーターを実行します。エラーを確認し、修正します。

dart analyze .
dart test
  • dart analyze でエラーが報告された場合: ステップ 3 に戻ります。
  • dart test が TypeError で失敗した場合: 無効な明示的キャスト(as T)を導入したか、未初期化の late 変数にアクセスしています。実行時エラーの箇所を特定し、型階層または初期化の順序を修正します。

例

例:Dynamic リストの代入を修正する

入力(静的解析に失敗):

void printInts(List<int> a) => print(a);

void main() {
  final list = []; // Inferred as List<dynamic>
  list.add(1);
  list.add(2);
  printInts(list); // Error: List<dynamic> can't be assigned to List<int>
}

出力(静的解析に合格):

void printInts(List<int> a) => print(a);

void main() {
  final list = <int>[]; // Explicitly typed
  list.add(1);
  list.add(2);
  printInts(list);
}
例:メソッドのオーバーライドを修正する(反変性)

入力(静的解析に失敗):

class Animal {
  void chase(Animal a) {}
}

class Cat extends Animal {
  @override
  void chase(Mouse a) {} // Error: Tightening parameter type
}

出力(静的解析に合格):

class Animal {
  void chase(Animal a) {}
}

class Cat extends Animal {
  @override
  void chase(covariant Mouse a) {} // Explicitly marked covariant
}
例:late による Null Safety の修正

入力(静的解析に失敗):

class Thermometer {
  String temperature; // Error: Non-nullable instance field must be initialized

  void read() {
    temperature = '20C';
  }
}

出力(静的解析に合格):

class Thermometer {
  late String temperature; // Defers initialization check to runtime

  void read() {
    temperature = '20C';
  }
}

コメント