概要
Flutter + Firebase で構築した習慣養成型の積分管理アプリ。毎日のサインインで積分を獲得し、連続日数に応じて倍率が上がる仕組みで継続利用を促す。積分は商品と交換でき、履歴管理やプッシュ通知設定にも対応する。単一コードベースでWeb・Android・Windowsに対応する。
対象ユーザー
- 毎日の習慣づけをゲーム感覚で続けたいユーザー
- 積分ベースのインセンティブ設計を導入したい事業者
- Flutter + Firebase を活用したモバイルアプリの構築例を確認したいエンジニア
Demo / GitHub
🔗 デモを見る | GitHub
スクリーンショット
ホーム画面 — ポイント残高・連続日数・サインインボタン・週間カレンダー
サインイン完了 — ポイント獲得アニメーション・連続日数表示
商品詳細 — ポイント交換・在庫状況・保有ポイント表示
交換履歴 — ステータス進捗バー・交換日時・ポイント消費記録
開発背景
Flutter + Firebase を用いたクロスプラットフォームアプリ開発の実践として、認証・ポイント管理・商品交換までを備えたアプリを企画・設計・実装した。
解決した課題
- 1つのコードベースでWeb・Android・Windowsの3プラットフォームに対応し、個別開発のコストを削減
- 連続ログイン日数に応じた倍率ボーナスにより継続利用を促進
- Firebase のセキュリティルールでユーザーごとのデータアクセス制御を実装し、他ユーザーのデータが閲覧・変更できない設計
- 積分の加算・消費・商品在庫の更新をFirestoreトランザクションで整合性を保証
主な機能
- ユーザー登録・ログイン(メール+パスワード認証)
- 毎日サインイン(連続ログインボーナス、週間カレンダー表示)
- ポイント管理(獲得・消費・残高表示)
- 商品一覧・交換機能(在庫管理付き)
- サインイン履歴・交換履歴
- プッシュ通知設定
- サインイン成功アニメーション(スケール+フェード+カウントアップ)
使用技術
- フロントエンド: Flutter (Dart)
- バックエンド: Firebase(Authentication / Firestore / Cloud Functions for Firebase)
- 状態管理: Provider (ChangeNotifier)
- デプロイ: Firebase Hosting
- ビルド: Android APK / Web / Windows対応
設計上の工夫
- Provider パターンによる状態管理: UserProvider に認証・サインイン・積分・交換のロジックを集約し、各画面はUIに専念する構成。Firebase とのデータアクセスを Provider 層へ集約し、UIとデータアクセスを分離することで保守性と拡張性を高めた
- Firestore セキュリティルール: ユーザーは自身のデータのみ読み書き可能、商品は全ユーザーに読み取り専用で在庫フィールドのみ更新可能、という最小権限の原則を適用
- シードデータの自動投入: 初回ログイン時にデモ商品を自動登録し、初期セットアップなしで即座に全機能を体験できる仕組み
- Firestoreトランザクション: ポイント加算・商品在庫更新・交換履歴作成を1つのトランザクションとして実行し、途中失敗時もデータ不整合が発生しないようにした
- IndexedStack による画面状態保持: 画面切替時に各タブの状態を保持し、一覧の検索条件やスクロール位置が失われない
- レスポンシブUI: Web・Android・Windowsで同じコードベースを利用しながら、画面サイズに応じてレイアウトを切り替える設計とした
アーキテクチャ
[ユーザー] ブラウザ / Android / Windows
↓
Flutter アプリ(Dart)
├─ Screens(Splash, Auth, Home, History, Products, Redemptions, Settings)
├─ Providers(UserProvider: 状態管理)
├─ Models(User, Product, Redemption, PointTransaction)
└─ Services(AuthService, DatabaseService)
↓
Firebase
├─ Authentication(メール認証)
├─ Firestore(users, signIns, products, redemptions)
├─ Cloud Functions for Firebase(定時処理)
└─ Hosting(Web版デプロイ)
開発周期
3週間
担当範囲
企画 / 設計 / フロントエンド / バックエンド / DB設計 / セキュリティルール / デプロイ
成果・実現したこと
- 認証・ポイント管理・商品交換・履歴管理を備えたフル機能アプリを開発し、Firebase Hosting でWeb版を公開
- Flutterの単一コードベースでWeb・Android・Windowsの3プラットフォーム対応を実現
- Firestore セキュリティルールによるユーザーデータ保護を実装し、本番運用可能な水準を達成
想定導入効果
- 連続ログインボーナスによる継続利用率の向上
- ポイント制度と連続ログインボーナスによるユーザーエンゲージメント向上
- クロスプラットフォーム対応による開発・保守コスト削減
開発で直面した課題と解決方法
- Firestore パーミッションエラー: シードデータの投入がログイン前に実行され、セキュリティルールでブロックされた。ログイン後にシード処理を移動して解決
- 週間カレンダーの表示不整合: 連続日数からの推定表示ではなく、Firestore の実際のサインイン記録を参照する方式に変更
- 交換後のUI無応答: ダイアログの context が pop 後に無効化される問題を、親 context で SnackBar を表示する方式で解決
- Firestore 複合クエリのインデックス: where + orderBy の複合クエリにインデックスが必要だったため、クライアント側ソートに変更して対応
このプロジェクトで学んだこと
- Flutter の Widget ツリーと Provider による状態管理の設計を実践し、画面数が増えても見通しの良い構成を維持する方法を身につけた
- Firebase を BaaS として活用することで、サーバー構築なしで認証・DB・ホスティングを統合する開発フローを経験した
- Firestore Security Rulesの設計を通じて、NoSQL環境における認可設計とデータアクセス制御の考え方を学んだ