类型 'String' 不是类型 'Event' 的子类型

type 'String' is not a subtype of type 'Event'

我正在将 table_calendar 添加到我的 flutter 应用程序中。这是一个非常缓慢的过程,但我学到了很多。我在为事件创建标记时遇到另一个错误。

这是错误:类型 'String' 不是类型 'Event' 的子类型 我已经阅读了有关此问题的一些资料,并且知道类型不匹配。我不确定如何解决这个问题或为什么会这样。

事件 class 的结构如下:

final String? eventName;
  final DateTime? eventStartTime;
  final String? eventDuration;
  final DateTime? eventDate;
  final String? eventDescription;
  final String? agentId;
  final String? agencyId;

这是我将事件数据加载到列表变量的地方。

List<Event> _getEventsForDay(DateTime day, [List<Event>? events]) {
    // kEvents is a linkedHashMap
    for (int i = 0; i < eventDoc.length; i++ ) {
      DateTime eventDate = eventDoc[i].eventDate;
      DateTime eventDateUTC = eventDate.toUtc();
      if (day.year == eventDate.year && day.day == eventDate.day && day.month == eventDate.month) {
        List<Event> eventList = [];
        //eventList.add(eventDoc[i].agencyId);
        //eventList.add(eventDoc[i].agentId);
        //eventList.add(eventDoc[i].eventDate);
        //eventList.add(eventDoc[i].eventDescription);
        //eventList.add(eventDoc[i].eventDuration);
        eventList.add(eventDoc[i].eventName);
        //eventList.add(eventDoc[i].eventStartTime);
        //print('kEvents: $kEvents');
        return (kEvents.putIfAbsent(eventDateUTC, () => eventList))??[];

      }
    }
    return [];
  }

列表中的哪个元素 eventList.add(eventDoc[i] 首先获取数据是抛出错误的元素。所以,我知道这些与 API 不匹配某处。

这是从 API 连同 link 到 API 的代码(我认为这是正确的代码): https://github.com/aleksanderwozniak/table_calendar/blob/master/lib/src/customization/calendar_builders.dart

// Signature for a function that creates a single event marker for a given `day`.
/// Contains a single `event` associated with that `day`.
typedef SingleMarkerBuilder<T> = Widget? Function(
    BuildContext context, DateTime day, T event);

/// Signature for a function that creates an event marker for a given `day`.
/// Contains a list of `events` associated with that `day`.
typedef MarkerBuilder<T> = Widget? Function(
    BuildContext context, DateTime day, List<T> events);

这是调用 _getEventsForDay 的地方:

Widget _buildTableCalendar(List<Event>? events) {
    return TableCalendar(
      firstDay: kFirstDay,
      lastDay: kLastDay,
      focusedDay: _focusedDay,
      selectedDayPredicate: (day) => isSameDay(_selectedDay, day),
      locale: 'en_US',
      eventLoader: (day) {
        return _getEventsForDay(day, events);
      },

这是我从 Firestore 获取和传递事件数据的地方:

StreamBuilder(
            //stream: _firestoreService.getEventStream(_selectedDay),
            stream: _db.collection('agency').doc(globals.agencyId).collection('event')
              .where('eventDate', isGreaterThanOrEqualTo: kFirstDay)
              .where('eventDate', isLessThanOrEqualTo: kLastDay)
                    .snapshots().map((snapshot) => snapshot.docs
              .map((document) => Event.fromFirestore(document.data()))
              .toList()),
            builder: (context, AsyncSnapshot <List<Event>> eventsSnapShot) {

              if (eventsSnapShot.hasData) {
                eventDoc = eventsSnapShot.data;
                //print('eventDoc: ' + eventDoc.toString());
                return _buildTableCalendar(eventsSnapShot.data);
              } else {
                return CircularProgressIndicator();
              }

哪里类型不匹配?我该如何解决这个问题?

EventDoc[i]是一个事件,可以添加到列表中,但是EventDoc[i].agencyId是一个字符串,不能添加到列表中,就像其他属性一样。要将事件添加到列表中,只需执行以下操作:

eventList.add(eventDoc[i]);