Androidアプリとして実験するためのアプリです。 このプロジェクトは、堅牢でテスト可能なアプリケーションを目指し、ミドルウェアパターンを取り入れた * MVI (Model-View-Intent)* アーキテクチャを採用するという実験も兼ねています。
本プロジェクトでは、Unidirectional Data Flow (UDF) を実現するために以下のコンポーネントを使用しています。
- UiState: UIの状態を表す不変(Immutable)なデータモデル。
- Intent: ユーザーの操作(ボタンタップ、テキスト入力など)を表す。
- Action: システム内部で処理されるアクション。Intentから変換される。
- Mutation: UiStateをどのように変更したいかという意図を表す。
- UiEffect: ナビゲーションやトースト表示など、一回限りのイベント。
- Reducer: 現在の
UiStateとMutationから新しいUiStateを生成する純粋関数。 - Store: Intentの処理、Actionへの変換、非同期処理(UseCaseの呼び出しなど)を管理する。
- UI が
IntentをViewModel.dispatch()に送る。 - ViewModel は
Storeのパイプラインを実行する。 - Intent Middleware (任意) が Intent を傍受/処理する。
IntentがActionに変換される。- Action Middleware (任意) が Action を傍受/処理する。
- Store が
handleActionでビジネスロジックを実行し、必要に応じてMutationやUiEffectを発行する。 - Reducer が
Mutationをもとに新しいUiStateを作成し、ViewModelはその新しいUiStateで更新する。 - UI が新しい
UiStateを受け取って再描画する。
:app: UI (Compose), ViewModels, DI 設定。:domain: ビジネスロジック (UseCase), モデル定義, リポジトリのインターフェース。:data: リポジトリの実装, データソース (Remote, Local)。:common: 共通ユーティリティ。
FeatureContract.ktの各マーカーインターフェースを継承して、その機能専用のIntent,Action,Mutation,UiState,UiEffectを定義します。Reducerインターフェースを実装し、状態遷移ロジックを記述します。BaseStoreを継承して、IntentからActionへの変換と、Actionのハンドリング(APIコール等)を実装します。BaseViewModelを継承して、上記コンポーネントを結合します。- ComposeでUIを構築し、
viewModel.uiState,viewModel.uiEffectを購読します。
- Language: Kotlin
- UI: Jetpack Compose
- DI: Hilt
- Async: Coroutines, Flow
- Architecture: MVI + Middleware Pattern