Flutter lean アーキテクチャ(コード生成なし)
コード生成を使わない Flutter 構成。feature-first + 軽量レイヤード、Riverpod の手書き provider、`--dart-define-from-file` による環境切替、余白・角丸・duration のトークン集約。コード生成を限定解禁する条件も規定。
Claude がこのスキルを読み込む条件
Flutter アプリを「コード生成なし」の軽量スタックで組む。feature-first + レイヤード構成、Riverpod の手書き provider、--dart-define-from-file による環境切替、余白・角丸・duration をトークンに集約する設計を適用する。ユーザーが Flutter アプリの新規作成・ディレクトリ構成・状態管理・テーマやテストの方針について話しているときに使う。Use when the user mentions Flutter, Riverpod, go_router, dart-define, Flutter project structure, or Flutter state management.
SKILL.md の frontmatter にある description
です。依頼の内容がここに書かれた状況に当てはまると、Claude が自分でこのスキルを読み込みます。
概要
Flutter アプリを build_runner 系のコード生成を使わずに組む構成。 feature-first の縦割り + 軽量レイヤードで、状態管理と DI は Riverpod に一本化する。
AI 支援開発ではボイラープレートを直接生成できるため、コード生成の主なメリット(記述量削減)が薄い。 一方でコード生成は依存グラフを重くし、SDK 更新時に真っ先に壊れる。この構成はそのトレードオフを 「生成しない」側に倒している。
コード生成が本当に必要になったときの例外条件は references/codegen-policy.md。
構成
lib/
main.dart
app.dart # MaterialApp.router / ProviderScope
core/ # 機能横断(どの feature にも依存しない)
config/ # AppConfig(環境値)、app_constants.dart
router/ # go_router 設定、RouteObserver
theme/ # app_theme.dart / app_metrics.dart
responsive/ # ブレークポイント、最大幅ラッパ
utils/ # 日付フォーマット等
widgets/ # 汎用 UI(dialogs / loading / save_bar 等)
features/<name>/ # 機能ごとに縦割り
data/ # repository 実装、データソース
domain/ # entity、repository インターフェース
presentation/ # Riverpod Notifier、画面 Widget
config/ # dev.json / stg.json / prod.json
docs/ # → spec-driven-dev スキル
test/
依存方向(これだけは崩さない)
presentation (Notifier / Widget)
↓ watch / read
domain (entity, repository インターフェース)
↑ implements
data (repository 実装, データソース = HTTP クライアント / ローカルストレージ)
- UI からデータソースを直接触らない。 必ず repository インターフェース越し。 これを守るとテストで repository をモックするだけで済む。
core/は features に依存しない。逆は可。- feature 間の直接依存を作らない。共有が必要になったものは
core/へ上げる。
実装の規約
- provider は手書き。
@riverpodアノテーションと生成コードを使わない。final itemsRepositoryProvider = Provider<ItemsRepository>((ref) => ItemsRepositoryImpl(ref.watch(apiClientProvider))); final itemsProvider = AsyncNotifierProvider<ItemsNotifier, List<Item>>(ItemsNotifier.new); - モデルは手書きの
fromJson/toJson。copyWithと==も必要な分だけ手で書く。 - HTTP クライアントは直書き(retrofit のような生成レイヤを挟まない)。
- 環境切替は
--dart-define-from-file。config/{dev,stg,prod}.jsonを作り、AppConfigで 1 か所から読む。 → references/config-and-flavors.md - 数値を画面に散らさない。余白・角丸・アニメーション時間は
core/theme/app_metrics.dartに集約し、AppThemeと各画面が同じトークンを参照する。→ assets/app_metrics.dartconst EdgeInsets.all(13)のような一点物を書かない。 - エラーは型付き例外。
printを使わない。 - アプリ固有の定数(表示名・プロダクトキー等)は
core/config/app_constants.dartに集約。
手順
新規プロジェクトを組むとき
flutter createの直後に上記のディレクトリを作る。config/{dev,stg,prod}.jsonとAppConfigを置く。app_metrics.dartを置き、AppThemeから参照させる(assets/app_metrics.dart をコピー)。go_routerのルート定義をcore/router/に置く。- 最初の feature を
features/<name>/{data,domain,presentation}で作る。 docs/を初期化する(→spec-driven-devスキル)。- UI/UX の方針を 1 枚にする(→
app-design-philosophyスキル)。ここが無いと生成コードが Material のデフォルトに落ちる。
既存プロジェクトに適用するとき
一度に作り替えない。次に触る feature から縦割りに直し、core/ に共通物を吸い上げる。
先に app_metrics.dart を導入して数値の散らばりを止めるのが、最も費用対効果が高い。
テスト方針
- 純ロジックの単体テストを主戦場にする: モデルの
fromJson、バリデーション関数、集計ヘルパー、Notifier の状態遷移。 - モックは
mocktail(コード生成なし)。repository インターフェースをモックし、HTTP クライアントは直接触らない。 - Widget テストは画面遷移のスモークを 1 本に留める。ゴールデンテストは費用対効果を見てから。
- 「何が自動テストで守られ、何が手動確認なのか」を 1 枚の spec にまとめる(→
spec-driven-dev)。
コマンド
flutter run --dart-define-from-file=config/dev.json
flutter run -d chrome --dart-define-from-file=config/dev.json
flutter build apk --dart-define-from-file=config/prod.json
flutter analyze # コミット前に必須
flutter test --dart-define-from-file=config/dev.json
ルール
freezed/*_generator/build_runnerを安易に追加しない。 追加したくなったら references/codegen-policy.md の条件を確認し、ADR を 1 枚書いてから。- UI から
dioなどのデータソースを直接呼ばない。 - 画面に数値リテラルを書かない(
AppMetricsを参照する)。 analyzeが通らないコードをコミットしない。
参考
- references/codegen-policy.md — コード生成を禁止する根拠と、限定解禁の条件
- references/config-and-flavors.md — 環境切替と
AppConfig - assets/app_metrics.dart — 余白・角丸・duration トークン
- 関連スキル:
spec-driven-dev/app-design-philosophy/app-store-submission
インストール
個人用(全プロジェクトで使う)
git clone https://github.com/yuuint/claude-skills.git
cp -r claude-skills/skills/flutter-lean-architecture ~/.claude/skills/ プロジェクト単位(チームで共有する)
cp -r claude-skills/skills/flutter-lean-architecture <your-project>/.claude/skills/ 同梱ファイル
SKILL.md から参照される参考資料・テンプレート・スクリプトです。ディレクトリごとコピーしてください。