ロマサガRSの所持キャラステータス管理用アプリです。Flutter学習用として作成しました。
assetsを管理対象外にすると吹っ飛んだ時に辛すぎたのでもう管理対象にしていいかと思いました。
レイヤー分けしておりView
とController
、Model
とRepository
で大きく分けています。
データ取得層はRepository
パターンを採用しています。
Controller
は基本以下の3構成としています。
2は画面起動時にキャラIDなどの引数をもらうProviderを生成している場合に作っていています。引数がない場合は1と2はまとめています。
また、note_pageなどUiStateを作ると煩雑になる場合は1のみ実装しています。
- 画面起動時の
Provider
(riverpodアノテーションで生成) - ロジックを集約した
Provider
- UiStateを保持する
StateProvider
UiState
を保持するStateProvider
はそのまま画面の状態を保持します。
ただし、キャラ詳細画面やステータス編集画面など前の画面の詳細情報を扱う場合、キャラデータをUiState
で持ってしまうより直接参照・更新した方がSSOTに沿えるためUiState
では管理していません。
また、UiState
はprivate
にしていてView
からwatch
するProvider
は別に定義しています。
UiState
の値はそれぞれselect
でwatch
することで「UiState
は必ずViewModel
を経由して更新する」という設計にしました。
今のところこのような設計で落ち着きました。
Firebaseで利用しているサービスは次の通りです。
- Authentication
- Googleアカウントと連携しています。サインイン状態だと入力したキャラデータのバックアップと復元ができるようになります。
- Storage
- キャラデータをjsonで持っています。
- Firestore
- 自身で入力したステータス情報のバックアップと復元に使います。
- Crashlytics
- クラッシュレポート
実際に使っているアプリとデバッグ用のアプリはBuildTypeで分割しています。
キャラデータが全て入ったjsonをいちいち読み込んで動作確認するのが辛かったため、動作確認はmain_dev.dart
で開発用のjsonを読み込むようにしています。
開発はvscodeでやっているのでlaunch.json
のprogramにこのdartファイルを指定してデバッグしています。
launch.json
例です。
{
"configurations": [
{
"name": "romansing_saga_app",
"request": "launch",
"type": "dart",
"program": "lib/main_dev.dart",
}
]
}