我花了很长时间研究尽可能多的stackoverflow问题以找到解决方案,但我全都没主意。本质上,我正在从我的API中加载数据,并且它返回事件类型的列表。下面显示了结构:
class Event{
final int eventId;
final String eventDate;
final String eventName;
final String eventDescription;
Event.fromJSON(Map<String, dynamic> json) :
eventId = json['eventId'],
eventDate = json['eventDate'],
eventName = json['eventName'],
eventDescription = json['eventDescription'];
}
用于检索它的异步方法如下:
Future<List<Event>> fetchMonthEvents(String month) async {
List<Event> eventList;
final response =
await http.get(/*MY_API_URL*/);
if (response.statusCode == 200) {
final List parsedList = json.decode(response.body);
eventList = parsedList.map((val) => Event.fromJSON(val)).toList();
return eventList;
} else {
throw Exception('Failed to load post');
}
}
现在是问题所在...
class _HomePageState extends State<HomePage> {
CalendarController _calendarController;
DateTime daySelected;
Map<DateTime, List> _events;
List _selectedEvents;
List<Event> _eventList = <Event> [];
List _dates;
final _selectedDay = DateTime.now();
@override
initState() {
super.initState();
this.daySelected = DateTime.now();
_fetchList();
_calendarController = CalendarController();
}
Future _fetchList() async {
_eventList = await fetchMonthEvents('2019-10');
// below is processing the of _eventList so events are mapped according the date
for(Event e in _eventList){
_dates.add(e.eventDate);
}
_dates.toSet().toList();
Map<DateTime, List> eventsParsed = {};
for(var i=0; i<_dates.length; i++){
List singleDayEvents = _eventList.where((e) => e.eventDate.contains(_dates[i])).toList();
eventsParsed[DateTime.parse(_dates[i])] = singleDayEvents;
}
_events = eventsParsed;
_selectedEvents = _events[_selectedDay] ?? [];
setState(() { //repeated code in a desperate attempt to make it work
_events = eventsParsed;
_selectedEvents = eventsParsed[_selectedDay] ?? [];
});
}
...
我继续遇到所有错误,因为_events为null。我认为这是由于Future对象的异步特性(对于该框架而言仍然是新特性)。我尝试使用.then()函数和流,但是没有运气。我尝试过使用FutureBuilder,但是与其他问题不同,TableCalendar小部件的events属性返回一个Map<DateTime, List<dynamic>>
。
基本上,我想要的只是从API返回的数据,用于在日历中填充事件。我愿意提出任何想法以使它生效。我已经在initState()中插入了对异步函数的调用,因为需要数据来加载日历。
我愿意接受任何建议,因为我有一个截止日期,所以在这一点上非常绝望。任何帮助将不胜感激!
答案 0 :(得分:0)
您能解释一下吗?
for(Event e in _eventList){
_dates.add(e.eventDate);
_eventList.add(e);
}
我看到您正在遍历_eventList
,在内部循环中您将添加到同一列表_eventList.add(e);
如果您能解释更多您遇到的困难,我绝对可以帮忙。