Flutter:类型 'Event' 不是类型 'List<dynamic>' 的子类型

标签 flutter dart google-cloud-firestore

我正在使用 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;
    }

根据文档table_calender #event

_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/

相关文章:

dart - 在小部件之间共享尺寸

android - Flutter 文本按钮波纹效果

dart - 如何访问通过 Polymer 定义的自定义元素的内部元素

flutter - 无法将键和 bool 值添加到嵌套列表中

javascript - Vue.js - 引用模式内的输入来更新 Firestore 数据库

dart - Flutter - 点击检测 TextField

flutter - list.forEach 在异步方法中没有正确等待

firebase - Flutter/Dart/Firestore : How can I add a list of maps to firebase?

javascript - 添加 href 以从 firestore 自动生成数据表

java - 如何从firestore数据库获取文档id