All skills

flutter-dart-code-review

Official
by Api.AirforcePrepends a system promptFrontend Development000 uses202,700

ウィジェットのベストプラクティス、状態管理パターン(BLoC、Riverpod、Provider、GetX、MobX、Signals)、Dartのイディオム、パフォーマンス、アクセシビリティ、セキュリティ、クリーンアーキテクチャをカバーするライブラリに依存しないFlutter/Dartのコードレビューチェックリスト。

open-sourceclaude-codefrontend-developmentaffaan-m
Share

What this skill does

When applied, it prepends a system prompt before your request is sent — no extra calls and no change to how you are billed beyond the added tokens.

---
name: flutter-dart-code-review
description: ウィジェットのベストプラクティス、状態管理パターン(BLoC、Riverpod、Provider、GetX、MobX、Signals)、Dartのイディオム、パフォーマンス、アクセシビリティ、セキュリティ、クリーンアーキテクチャをカバーするライブラリに依存しないFlutter/Dartのコードレビューチェックリスト。
origin: ECC
---

# Flutter/Dartコードレビューベストプラクティス

Flutter/Dartアプリケーションをレビューするための包括的なライブラリに依存しないチェックリスト。これらの原則は、どの状態管理ソリューション、ルーティングライブラリ、またはDIフレームワークを使用していても適用されます。

---

## 1. 全般的なプロジェクトの健全性

- [ ] プロジェクトは一貫したフォルダー構造に従っている(フィーチャーファーストまたはレイヤーファースト)
- [ ] 適切な関心の分離: UI、ビジネスロジック、データレイヤー
- [ ] ウィジェットにビジネスロジックがない; ウィジェットは純粋にプレゼンテーション
- [ ] `pubspec.yaml`が整理されている — 未使用の依存関係がなく、バージョンが適切に固定されている
- [ ] `analysis_options.yaml`に厳格なリントセットと厳格なアナライザー設定が含まれている
- [ ] 本番コードに`print()`文がない — `dart:developer`の`log()`またはロギングパッケージを使用
- [ ] 生成されたファイル(`.g.dart`、`.freezed.dart`、`.gr.dart`)が最新か`.gitignore`に含まれている
- [ ] プラットフォーム固有のコードが抽象化の背後に分離されている

---

## 2. Dart言語の落とし穴

- [ ] **暗黙的なdynamic**: 型アノテーションの欠如が`dynamic`につながる — `strict-casts`、`strict-inference`、`strict-raw-types`を有効にする
- [ ] **Null安全の誤用**: 適切なnullチェックやDart 3のパターンマッチング(`if (value case var v?)`)の代わりに過度な`!`(bang演算子)
- [ ] **型プロモーションの失敗**: ローカル変数プロモーションが機能する場所で`this.field`を使用
- [ ] **過度に広い例外のキャッチ**: `on`句なしの`catch (e)`; 常に例外型を指定する
- [ ] **`Error`のキャッチ**: `Error`のサブタイプはバグを示し、キャッチすべきでない
- [ ] **未使用の`async`**: `await`しない`async`マークされた関数 — 不要なオーバーヘッド
- [ ] **`late`の過剰使用**: nullable型やコンストラクターの初期化がより安全な場所での`late`の使用; エラーをランタイムに先送りにする
- [ ] **ループでの文字列連結**: 繰り返しの文字列構築には`+`の代わりに`StringBuffer`を使用
- [ ] **`const`コンテキストでの可変状態**: `const`コンストラクタークラスのフィールドは可変であるべきでない
- [ ] **`Future`の戻り値の無視**: 意図を示すために`await`を使用するか明示的に`unawaited()`を呼び出す
- [ ] **`final`が使える場所での`var`**: ローカル変数には`final`を、コンパイル時定数には`const`を優先
- [ ] **相対インポート**: 一貫性のために`package:`インポートを使用
- [ ] **公開された可変コレクション**: パブリックAPIは生の`List`/`Map`ではなく変更不可能なビューを返すべき
- [ ] **Dart 3パターンマッチングの欠如**: 冗長な`is`チェックと手動キャストの代わりにswitch式と`if-case`を優先
- [ ] **複数の戻り値のための使い捨てクラス**: 単一使用のDTOの代わりにDart 3のレコード`(String, int)`を使用
- [ ] **本番コードでの`print()`**: `dart:developer`の`log()`またはプロジェクトのロギングパッケージを使用; `print()`はログ

Use this skill

Per request

Add a "skill" field with the skill’s ID to your chat completion request. It is applied server-side before your prompt is sent — no extra calls.

{
  "model": "gpt-4o-mini",
  "skill": "imp-f68ad609-6637-4167-87d6-b75e62137e14",
  "messages": [{ "role": "user", "content": "…" }]
}
Always on — no field to send

Install the skill, enable it in your dashboard and (optionally) limit it to specific models. It then applies automatically to every matching request — with no "skill" field to send each time.

Set it up in your dashboard