間隔反復学習を備えた日本語学習アプリ
適応型の復習スケジュール、語彙・漢字学習、Firestoreのトランザクションによる学習記録を備えたFlutterアプリです。個人プロジェクトとして開発を続けています。
- 担当
- 個人プロジェクトの開発
- 種別
- 個人開発・開発中, 2026
- 使用技術
- Flutter, Dart, Riverpod, Firebase Auth, Cloud Firestore, Cloud Functions
概要
日本語の教材学習と間隔反復を一つの流れにまとめたアプリです。語彙や漢字を学び、学習デッキに追加し、復習期限と1日の新規カード上限に沿って学習を進めます。
開発の中心は復習システムです。UIから独立したスケジューラー、永続化のためのリポジトリインターフェース、カード・復習履歴・学習統計をまとめて更新する構成を実装しています。開発中のため、時間制限付き模擬試験や一部のバックエンド機能は未完成です。
課題
復習では、期限を迎えた教材と新しい教材の量を調整する必要があります。また、次回の復習日、復習履歴、日々の学習記録が、同じ回答操作を一貫して反映する必要があります。
仕組み
学習キューの作成
復習画面で期限を迎えたカードと当日の学習記録を読み込み、1日の上限に収まる数の新規カードを追加します。
回答評価と次回日程
純粋なDartのスケジューラーが回答評価から記憶状態と次回の復習日を算出します。日単位のFSRSと、代替としてSM-2を実装しています。
復習記録の保存
Firestoreのトランザクションでカード、復習ログ、日次統計、必要な連続学習日数の更新をまとめて保存します。学習データは認証済みユーザーのドキュメント配下で管理します。
設計上の判断
スケジューリングをUIから分離
スケジューラーは状態、評価、時刻を引数で受け取り、FirebaseやFlutterの状態に依存しません。新規カード、失念、保持率、決定性を確認するテストがあり、日程計算を独立して検証できる構成です。
関連する学習記録を一括更新
回答評価は複数の記録に影響します。書き込みをトランザクションにまとめることで、カードだけが更新されて履歴や日次統計が残らない状態を避けます。ただし、複数端末で同じカードを同時に復習した場合の競合は別途検討が必要です。
模擬試験の推定値を明示
採点サービスは総合点と各セクションの基準を確認し、結果を推定値として明示します。採点ロジックは独立して実装されていますが、時間制限付きの試験画面との一連の連携は未完成です。
制約と今後の改善
- 時間制限付き模擬試験を完成させ、既存の採点サービスに接続する。
- 復習通知、購入検証、教材公開、アカウント削除の未実装の関数を完成させる。
- 復習記録の保存と複数端末での同時更新に対する統合テストを追加する。現在の単体テストはスケジューリングと採点が中心。