dart-fix-runtime-errors について
Dart の静的解析エラーを診断・修正するためのスキルです。型安全性、null 安全性、例外処理を扱い、解析とテストによる確認手順を示します。
主な機能
- 01型システムとジェネリクスの指針
- 02null 安全性エラーの解決
- 03例外処理の原則
- 04解析器と dart fix の手順
- 05テストによる修正確認
活用シーン
- 01Dart プロジェクトの解析エラー修正
- 02null と型の不一致への対処
- 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';
}
}
コメント
Markdown 対応