月謝袋アプリ カレンダー機能実装記録

目次

今回実装したこと

  • 生徒ごとの色分けカレンダー表示
  • 日付タップで詳細ダイアログ表示
  • 時間重複のダブルブッキング検知
  • プレミアム未加入者向けロック画面

ハマったポイント

あれ、何も表示されない!!

Firestoreの複合インデックス

lessons コレクションで groupID と lessonDateTime を
組み合わせたクエリを実行すると以下のエラーが発生:
コンソールを見ると:

cloud_firestore/failed-precondition: The query requires an index.

エラーメッセージのURLを開いて「保存」するだけで解決。
インデックス反映まで2〜3分かかります。

studentUidから生徒名を取得

最初は名前でなくIDが表示!!困った!!

lessons コレクションには生徒名でなく studentUid が保存されている。
user コレクションをグループIDで一括取得し、
uid → display_name のマップを作ることで解決。→無事に名前が表示されました!!

final usersSnapshot = await FirebaseFirestore.instance
    .collection('user')
    .where('groupID', isEqualTo: groupID)
    .get();

for (final userDoc in usersSnapshot.docs) {
  final uid = userDoc.data()['uid'] as String? ?? '';
  final name = userDoc.data()['display_name'] as String? ?? '';
  uidToName[uid] = name;
}

ダブルブッキング検知のロジック

同じ日の複数レッスンを取得し、
開始・終了時間が重複しているかを判定:

if (aStart.isBefore(bEnd) && bStart.isBefore(aEnd)) {
  doubleBookedDays.add(day);
}

時間が少しでも重なっていれば警告バナーを表示します。

目次