flutter-riverpod-arch について
feature-first 構成、Riverpod、flutter_hooks を用いた Flutter アプリ設計のスキルです。レイヤー分割、状態管理、レスポンシブ UI、コード生成、テストの指針を示します。
主な機能
- 01feature-first のプロジェクト構成
- 02Presentation、UseCase、Repository の層
- 03Riverpod プロバイダー範囲の指針
- 04HookConsumerWidget の UI パターン
- 05レスポンシブレイアウト規則
- 06テストとコード生成の指針
活用シーン
- 01機能ディレクトリと層の計画
- 02ビューのロジックとデータ処理の分離
- 03Riverpod の状態とプロバイダー管理
- 04Repository、UseCase、Widget のテスト
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ hukusuke1007/ agent-skills --skill flutter-riverpod-archインストール後、Claude Code で/flutter-riverpod-archを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/architecture.mdpresentation.mdproviders.mdriverpod.mdtesting.mdreferences/ui/button.mdlist.mdresponsive.md詳細
Flutter Riverpod アーキテクチャ
目的
Feature-First のディレクトリ構成、状態管理に Riverpod(コード生成を使用)、UI の構成に flutter_hooks / HookConsumerWidget を使用して、スケーラブルな Flutter アプリケーションを実装します。このアーキテクチャは、ドメイン駆動設計とクリーンアーキテクチャに着想を得た軽量なアプローチです。設計思想は Presentation、Domain、Infrastructure の 3 層で、このスキルにおけるコードレベルの表記は UI、UseCase、Repository です。データソースへのアクセスは Repository 内にカプセル化します。Repository のプロバイダーには @Riverpod(keepAlive: true) を、画面スコープの状態には @riverpod を適用します。
レイヤーの対応関係(正)
| 設計思想 | コードレベルの表記 |
|---|---|
| Presentation | UI |
| Domain | UseCase |
| Infrastructure | Repository |
判断ロジック
タスクが UI、UseCase、Repository のどれに該当するか、機能固有か共通か、またどの Riverpod スコープが適切かを判断します。
構成と命名については architecture.md、Repository/UseCase の配置については providers.md、プロバイダーのスコープ規則については riverpod.md を参照してください。
手順
1. 機能の構成を計画する
機能を特定し、実装が共通か機能ローカルかを確認してから、コーディングを始める前にファイルを適切なレイヤーに配置します。
ディレクトリ構成と命名については architecture.md を参照してください。
2. Repository レイヤーを実装する
Repository レイヤーに Repository コードを実装し、Repository プロバイダーに関する Riverpod/プロバイダーの規則に従います。
Repository の実装の詳細については providers.md、プロバイダーのスコープ規則については riverpod.md を参照してください。
3. UseCase レイヤーを実装する
検証、オーケストレーション、UI に反映する状態変更のために、UseCase レイヤーに UseCase コードを実装します。
UseCase のパターンについては providers.md、プロバイダーのスコープ規則については riverpod.md を参照してください。
4. HookConsumerWidget で UI を構築する
このスキルで定められたパターンを使用し、Presentation レイヤーに UI を構築します。
ページとウィジェットの構成については presentation.md、ref.watch / ref.read については riverpod.md、ボタンとカーソルの規則については button.md を参照してください。
5. レスポンシブレイアウトを実装する
このスキルで定められたレスポンシブレイアウトの規則を適用します。
ブレークポイントの方針とレスポンシブレイアウトのパターンについては responsive.md を参照してください。
6. テストを作成する
このスキルのテストパターンを使用して、Repository、UseCase、コントローラー、ウィジェットの動作をテストします。
テストの構成、オーバーライド、フェイク/モックのパターンについては testing.md を参照してください。
制約
HookConsumerWidgetを優先する: このスキルでは、状態を持つページや複雑なウィジェットすべてにflutter_hooksと併用したHookConsumerWidgetを使用します。Riverpod との連携がない、独立したローカル UI 状態に限り、StatefulWidgetを使用できます。build内でref.read()を使用しない:ref.read()はイベントハンドラーまたはコールバック内でのみ使用してください。リアクティブな UI 状態を導出するために、buildメソッドの先頭で使用してはいけません。- イベントハンドラー内で
ref.watch()を使用しない:ref.watch()はbuild()内、またはプロバイダーのbuild()メソッド内でのみ使用してください。 - ビューにビジネスロジックを記述しない: ウィジェットクラスには、レイアウト、条件付きレンダリング、ナビゲーションのみを含めてください。データの変換と検証はすべて、ユースケースまたはリポジトリに記述する必要があります。
- リストのパターン: list.md で定義されているリストとスライバーのルールに従ってください。
- スタイル設定のみを目的とするボタンラッパーウィジェットは避ける: 固定のボタンスタイルを適用することだけを目的としたカスタムラッパーウィジェットは作成しないでください。ローディング状態や送信フローなどの動作をカプセル化する場合は、ラッパーを使用できます。
- 対象を絞った
MediaQueryの静的メソッドを使用する: 不要な再ビルドを避けるため、MediaQuery.of(context)よりもMediaQuery.sizeOf、MediaQuery.paddingOf、MediaQuery.orientationOfなどを優先してください。 - ページレベルのブレークポイントに
LayoutBuilderを使用しない:MediaQuery.sizeOfを使用するResponsiveLayoutを使用してください。これにより、レイアウトの判定は親の制約ではなく、実際の画面幅に基づいて行われます。 - macOS/Web ではマウスカーソルを指定する: すべての
ButtonバリアントにenabledMouseCursor: SystemMouseCursors.clickを含めてください。すべてのInkWellにmouseCursor: SystemMouseCursors.clickを含めてください。 - コード生成は必須:
@riverpodアノテーションを追加または変更した後は、必ずdart run build_runner buildを実行してください。 - 命名規則: ファイルとディレクトリには
snake_caseを使用します。クラスにはUpperCamelCaseを使用します。ページクラス名の末尾はPage、リポジトリクラス名の末尾はRepositoryとします。ユースケースクラス名には動詞と名詞の形式を使用します(例:FetchPosts、CreatePost)。
参考ファイル
- architecture.md — プロジェクト構造、ディレクトリ構成、命名規則
- providers.md — リポジトリとユースケースの実装パターン
- riverpod.md — プロバイダーの種類、
ref.watchとref.readの使い分け、キャッシュ、コード生成 - presentation.md — ページ構成、ナビゲーション、フックの使用方法、エラー処理
- testing.md — テストパターン、モック戦略、
ProviderContainerの使用方法 - button.md — ボタンのパターン、
styleFrom、macOS/Web のホバーカーソル - list.md —
ListView.builder、プルトゥリフレッシュ、スライバーを使用したページネーション - responsive.md — ブレークポイント、
ResponsiveLayout、プラットフォーム固有のレイアウト