/flutter_sample_project

Flutterのサンプルアーキテクチャ

Primary LanguageDart

各レイヤの方針

presentation

  • 基本的にhooksを扱う場合以外状態を持たない
  • 画面やウィジェットの出し分けが必要な場合はStateNotifierの状態として保持

domain/notifier

  • 基本的にStateNotifierProvider.autoDisposeとして利用し、StateNotifierのライフサイクルを各ページのライフサイクルと一致させる
  • 状態はStateクラスに持る

domain/service

  • 基本的に状態を持たない
  • ビジネスロジックを記述する
  • APIから取得した状態の保持はRepositoryで行う
  • Provider.autoDisposeを基本的に利用し、notifier(presentation)側とライフサイクルを一致させる

infrastructure/repository

  • ユースケースや要求に応じて状態を持つ場合がある
  • dataSourceからの取得値を状態(cache)として変数で保持する。そのため、autoDisposeはしない。
  • コンストラクタの永続化はProviderで定義することで実現する

infrastructure/dataSource

  • 状態を持たない
  • 通信により取得した値のキャッシュはrepositoryで行う

保存例

カテゴリ 使用例 状態の保存場所
画面のコンポーネントが持つ状態 検索のソート条件 stateで保持。前回の条件を保持するといった場合はRepositoryなどでキャッシュとして保持
画面全体が持つ状態 ユーザー情報全体 Repository層のキャッシュ
複数の画面にまたがる状態 実行中のタスクID GoRouterのqueryParamsで継承
アプリ全体で持つ状態 初回起動フラグ SharedPreferenceによる保持