我正在使用 TableCalendar 显示来自 Firebase 的事件。我“成功”将它们显示在日历中,但是当天的事件颜色为红色,并出现错误 type 'Event' is not a subtype of type 'List<dynamic>'
。我按照 pub dev page 上的指南进行操作包来显示事件。我该如何修复它?我不想只在日历上显示没有标题的事件
我的主要代码:
@override
void initState() {
super.initState();
getEvents();
}
getEvents() async {
var data = await FirebaseFirestore.instance.collection('events').get();
List<Event> eventList = [];
for (int i = 0; i < data.docs.length; i++) {
var time = (data.docs[i]['date'] as Timestamp).toDate();
var title = Event(data.docs[i]['title']);
map[time] = title;
}
print(map);
}
List _getEventsForDay(DateTime day) {
final events = LinkedHashMap(equals: isSameDay, hashCode: getHashCode)
..addAll(map);
return events[day] ?? [];
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: appbar('title'),
body: SafeArea(
child: TableCalendar(
firstDay: kFirstDay,
lastDay: kLastDay,
focusedDay: _focusedDay,
eventLoader: (day) {
return _getEventsForDay(day);
},
),
),
);
}
我的模型文件:
class Event {
final String title;
const Event(this.title);
@override
String toString() => title;
}
Map<DateTime, dynamic> map = {};
int getHashCode(DateTime key) {
return key.day * 1000000 + key.month * 10000 + key.year;
}
final kToday = DateTime.now();
final kFirstDay = DateTime(kToday.year, kToday.month - 1, kToday.day);
final kLastDay = DateTime(kToday.year, kToday.month + 1, kToday.day);
最佳答案
问题出在将 firestore 数据转换到 map 的 for 循环中
for (int i = 0; i < data.docs.length; i++) {
var time = (data.docs[i]['date'] as Timestamp).toDate();
var title = Event(data.docs[i]['title']);
map[time] = title;
}
_getEventsForDay() can be of any implementation. For example, a Map<DateTime, List<T>> can be used:
map 应该是 Map<DateTime, List<T>>
的子类型但您正在转换事件而不是列表。
因此,如下更改代码并在 List<Event>
中添加标题
for (int i = 0; i < data.docs.length; i++) {
var time = (data.docs[i]['date'] as Timestamp).toDate();
var title = Event(data.docs[i]['title']);
map[time] = [title];
}
- 为了始终防止出现此问题并提高代码可读性,请在声明变量时指定变量的类型
关于Flutter:类型 'Event' 不是类型 'List<dynamic>' 的子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68826818/