【发布时间】:2019-10-28 01:38:33
【问题描述】:
我花了很长时间研究尽可能多的 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 为空。我认为这是由于 Future 对象的异步特性(对于这个框架来说仍然是新的)。我尝试使用 .then() 函数和流,但没有运气。我尝试过 FutureBuilder,但与其他问题不同的是,TableCalendar 小部件的 events 属性返回 Map<DateTime, List<dynamic>>。
基本上,我想要从 API 返回的数据用于填充日历中的事件。我对任何想法持开放态度,以使其发挥作用。我在 initState() 中插入了对异步函数的调用,因为需要数据来加载日历。
我对任何建议都持开放态度,在这一点上非常绝望,因为我有一个截止日期。任何帮助将不胜感激!
【问题讨论】:
标签: asynchronous flutter dart future