| name | flutter-dart-code-review |
| description | ウィジェットのベストプラクティス、状態管理パターン(BLoC、Riverpod、Provider、GetX、MobX、Signals)、Dartのイディオム、パフォーマンス、アクセシビリティ、セキュリティ、クリーンアーキテクチャをカバーするライブラリに依存しないFlutter/Dartのコードレビューチェックリスト。 |
| origin | ECC |
Flutter/Dartコードレビューベストプラクティス
Flutter/Dartアプリケーションをレビューするための包括的なライブラリに依存しないチェックリスト。これらの原則は、どの状態管理ソリューション、ルーティングライブラリ、またはDIフレームワークを使用していても適用されます。
1. 全般的なプロジェクトの健全性
2. Dart言語の落とし穴
3. ウィジェットのベストプラクティス
ウィジェットの分解:
Constの使用:
Keyの使用:
テーマとデザインシステム:
buildメソッドの複雑さ:
4. 状態管理(ライブラリに依存しない)
これらの原則はすべてのFlutter状態管理ソリューション(BLoC、Riverpod、Provider、GetX、MobX、Signals、ValueNotifier など)に適用されます。
アーキテクチャ:
イミュータビリティと値の等値性(イミュータブル状態ソリューション用: BLoC、Riverpod、Redux):
リアクティビティの規律(リアクティブ変異ソリューション用: MobX、GetX、Signals):
状態の形状設計:
// 悪い例 — ブールフラグの混乱が不可能な状態を許可する
class UserState {
bool isLoading = false;
bool hasError = false; // isLoading && hasErrorが表現可能!
User? user;
}
// 良い例(イミュータブルアプローチ) — sealed型が不可能な状態を表現不可能にする
sealed class UserState {}
class UserInitial extends UserState {}
class UserLoading extends UserState {}
class UserLoaded extends UserState {
final User user;
const UserLoaded(this.user);
}
class UserError extends UserState {
final String message;
const UserError(this.message);
}
// 良い例(リアクティブアプローチ) — observableのenum + データ、リアクティビティAPIを通じた変異
// enum UserStatus { initial, loading, loaded, error }
// ソリューションのobservable/signalを使用してstatusとdataを別々にラップする
再構築の最適化:
サブスクリプションと廃棄:
ローカル対グローバル状態:
5. パフォーマンス
不要な再構築:
build()内の高コスト操作:
画像の最適化:
遅延ローディング:
その他:
6. テスト
テストの種類と期待値:
カバレッジの目標:
テストの分離:
ウィジェットテストの品質:
7. アクセシビリティ
セマンティックウィジェット:
スクリーンリーダーのサポート:
視覚的アクセシビリティ:
インタラクションのアクセシビリティ:
8. プラットフォーム固有の考慮事項
iOS/Androidの違い:
レスポンシブデザイン:
9. セキュリティ
安全なストレージ:
APIキーの処理:
入力バリデーション:
ネットワークセキュリティ:
10. パッケージ/依存関係のレビュー
pub.devパッケージの評価:
バージョン制約:
モノリポ固有(melos/workspace):
11. ナビゲーションとルーティング
一般原則(任意のルーティングソリューションに適用):
12. エラー処理
フレームワークエラー処理:
エラーレポート:
グレースフルデグラデーション:
13. 国際化(l10n)
セットアップ:
コンテンツ:
コードレビュー:
14. 依存性注入
原則(任意のDIアプローチに適用):
15. 静的解析
設定:
適用:
リントパッケージに関わらず確認すべき主要なルール:
状態管理クイックリファレンス
以下の表は普遍的な原則を人気のソリューションでの実装にマッピングしています。プロジェクトが使用するソリューションにレビュールールを適応させるために使用してください。
| 原則 | BLoC/Cubit | Riverpod | Provider | GetX | MobX | Signals | ビルトイン |
|---|
| 状態コンテナ | Bloc/Cubit | Notifier/AsyncNotifier | ChangeNotifier | GetxController | Store | signal() | StatefulWidget |
| UIコンシューマー | BlocBuilder | ConsumerWidget | Consumer | Obx/GetBuilder | Observer | Watch | setState |
| セレクター | BlocSelector/buildWhen | ref.watch(p.select(...)) | Selector | N/A | computed | computed() | N/A |
| 副作用 | BlocListener | ref.listen | Consumerコールバック | ever()/once() | reaction | effect() | コールバック |
| 廃棄 | BlocProviderで自動 | .autoDispose | Providerで自動 | onClose() | ReactionDisposer | 手動 | dispose() |
| テスト | blocTest() | ProviderContainer | ChangeNotifierを直接 | テストでGet.put | ストアを直接 | signalを直接 | ウィジェットテスト |
ソース