dart-fix-runtime-errors について
静的解析の指摘や実行時障害に対処する Dart 開発者向けのトラブルシューティングスキルです。型安全性、null 安全性、例外処理と修正確認の手順を扱います。
主な機能
- 01型とジェネリクスの安全性確認
- 02null 安全性と初期化への対処
- 03例外とエラーの区別
- 04解析と自動修正の実行
- 05テストによる修正確認
活用シーン
- 01Dart の型エラーの診断
- 02null と late 初期化障害の修正
- 03例外処理と再スローの改善
- 04静的解析の修正確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ dhruvanbhalara/ skills --skill dart-fix-runtime-errorsインストール後、Claude Code で/dart-fix-runtime-errorsを入力して読み込まれたか確認します。
詳細
目次
型システムと健全性
Dart は健全な型システムを強制し、変数が実行時にコンパイル時の型と一致することを保証します。実行時の型エラーを防ぐには:
- メソッドのオーバーライド: サブクラスのオーバーライドが共変の戻り値の型と反変のパラメータ型を維持していることを確認してください。安全性チェックをオーバーライドするために
covariantキーワードを明示的に使用する場合を除き、サブクラスでパラメータ型を厳しくしてはいけません。 - ジェネリクスとコレクション型: 型付けされていないコレクション(例えば
List<dynamic>)を、強い型付けのターゲットに直接代入することは避けてください。リストやマップの初期化時には、常に明示的なジェネリックパラメータ(例えばList<String>)を指定してください。 - 明示的なダウンキャスト:
dynamicの値からの暗黙的なダウンキャストは避けてください。明示的な型キャスト(例えばas List<Map<String, dynamic>>)は、基になる構造が一致することが保証されている場合にのみ使用してください。 - 厳格な設定: プロジェクトの
analysis_options.yamlで厳格なキャスト設定を有効にし、明示的なキャストを強制して、コード解析中に動的型付けのバグを検出します:analyzer: language: strict-casts: true
Null 安全と変数の初期化
変数の状態を適切に管理し、コンパイル時のアナライザーエラーや実行時のヌルポインタ例外を回避します:
- Null 許容インジケーター: null 値を保持できる型には
?を付けます。値が確実に非 null であると断言する場合にのみ!を使用してください。 - 遅延初期化:
lateキーワードは、変数が最初のアクセスの前に初期化されることが保証されている場合にのみ適用してください。late 変数が初期化前にアクセスされると、実行時にLateInitializationErrorがスローされます。 - ワイルドカード変数: 意図的に未読のローカルパラメータや変数を宣言するには、単一のアンダースコア
_(モダンな Dart バージョンでサポート)を使用し、未使用変数の lint を満たします。
エラーと例外の処理
回復可能なアプリの障害(例外)と回復不能なバグ(エラー)を区別します:
- 例外のキャッチ: try-catch ブロックを実装して、
Exceptionのサブクラス(例えばFormatException、SocketException)をキャッチして処理します。これらはアプリケーションが適切に処理すべき予期される実行時障害を表します。 - エラーのキャッチを避ける:
Errorやそのサブクラス(例えばTypeError、RangeError)をキャッチしないでください。エラーは開発中に修正すべきコーディングのバグを表し、実行時に抑制してはいけません。 - 再スロー: ログ記録やクリーンアップのために例外をキャッチする場合、キャッチした例外を再度スローするのではなく、常に
rethrowキーワードを使用してください。rethrowは元のスタックトレースを保持します。
ワークフロー: 静的解析と実行時障害の解決
静的および実行時のバグを特定、修正、検証するには、このチェックリストに従ってください:
- 静的アナライザーを実行: プロジェクトのルートで
dart analyze . --fatal-infosを実行します。 - 自動修正を適用: 以下を使用して機械的な調整をプレビューし、適用します:
dart fix --dry-run dart fix --apply - 手動修正を特定: 複雑な警告に対処します:
- null 許容の競合が報告された場合: ビジネスロジックを評価し、合体演算子
??を使用してデフォルトを指定するか、null 認識チェーン?.を使用します。 - 共変の不一致が報告された場合: サブクラスのパラメータを調整するか、
covariant修飾子を適用します。
- null 許容の競合が報告された場合: ビジネスロジックを評価し、合体演算子
- テストの実行:
dart testまたはflutter testを実行して、実行時の健全性を確認します。 - late の状態変化を検証: 実行時に
TypeErrorまたはLateInitializationErrorが発生した場合はスタックトレースを検査し、初期化フローを修正します。
例
動的リスト代入の修正
// Fails Static Analysis due to List<dynamic> assignment:
void printScores(List<int> scores) => print(scores);
void badMain() {
final scores = []; // Inferred as List<dynamic>
scores.add(90);
printScores(scores); // Error: List<dynamic> cannot be assigned to List<int>
}
// Corrected Implementation:
void goodMain() {
final scores = <int>[]; // Explicitly typed
scores.add(90);
printScores(scores); // Compiles and runs safely
}
メソッドのオーバーライドと共変
class Worker {
void performTask(Task t) {}
}
// Fails Static Analysis: Tightening parameter type from Task to CodingTask
class SoftwareEngineer extends Worker {
@override
void performTask(CodingTask t) {}
}
// Corrected Implementation using the covariant keyword:
class LeadSoftwareEngineer extends Worker {
@override
void performTask(covariant CodingTask t) {}
}
late 初期化の安全な管理
class DatabaseClient {
// Late keyword defers null safety checks to runtime
late final String connectionString;
void initialize(String url) {
connectionString = url;
}
void connect() {
// If connect() is called before initialize(), this throws a LateInitializationError
print('Connecting to $connectionString');
}
}
コメント
Markdown 対応