类型 '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]);
我正在将 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]);