目次
今回実装したこと
- 生徒ごとの色分けカレンダー表示
- 日付タップで詳細ダイアログ表示
- 時間重複のダブルブッキング検知
- プレミアム未加入者向けロック画面
ハマったポイント
あれ、何も表示されない!!

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);
}
時間が少しでも重なっていれば警告バナーを表示します。

