万年素人からHackerへの道

万年素人がHackerになれるまで殴り書きするぜ。

Architecture case studyの要約

https://docs.flutter.dev/app-architecture/case-study

🧭 概要

このガイドでは、Compass アプリという実例を通して、Flutter の推奨アーキテクチャ(MVVM パターン+Repository/Service 構成)をどのように実装するかを解説しています。Compass は旅行の行程を作成・予約できる本格的なサンプルアプリで、実運用を想定した大規模構成になっています。

🧩 学べる内容

Flutter のアーキテクチャガイドを実装する方法

Repository と Service を使ったデータ層設計

MVVM による UI 層設計

Command パターン を用いた安全な UI 更新

ChangeNotifier / Listenable による状態管理

Provider パッケージを用いた依存性注入

推奨アーキテクチャに沿ったテスト構成

大規模 Flutter アプリのための効果的なパッケージ構造

🏗️ パッケージ構成のポイント 📁 ディレクトリ構成(例) lib/ ├── ui/ │ ├── core/ # 共通UIウィジェットやテーマ │ └── / # 各機能ごとのUI │ ├── view_model/ │ └── widgets/ ├── domain/ │ └── models/ # アプリ内データモデル ├── data/ │ ├── repositories/ │ ├── services/ │ └── model/ # APIモデル ├── config/ ├── utils/ ├── routing/ └── main.dart, main_staging.dart, main_development.dart

テスト関連:

test/ # ユニット & ウィジェットテスト testing/ # モックやフェイクなどのテスト補助コード

💡 設計の考え方

UI層(View / ViewModel) は機能単位(feature-based)で整理。 → 各機能に1つの View と 1つの ViewModel を持つ。

データ層(Repository / Service) は型単位(type-based)で整理。 → 複数機能から再利用できるよう設計。

domain層 にはアプリ全体で共通するモデルを配置。

coreフォルダ はブランドテーマや共通UI(ボタン・フォーム等)を格納。

3種類の mainファイル(開発・ステージング・本番)を使い分け。

🔁 他のアーキテクチャとの関係

この事例は MVVM + ChangeNotifier を採用していますが、 同様の構成は Riverpod, flutter_bloc, Signals などでも実現可能です。 また、データ取得をメソッド呼び出しではなく Stream で実装することも可能です。

🧠 まとめ

Flutter チーム推奨の「MVVM + Repository + Service」構成を実例で解説。

コードの見通しが良く、スケーラブルでテスト容易性が高い。

FeatureごとにUI層を分割, Typeごとにデータ層を分離 が基本方針。

実際の Compass アプリの全コードは GitHub 上で参照可能。