Я потратил целую вечность, просматривая столько вопросов о стековом потоке, чтобы найти решение, но у меня нет идей. По сути, я загружаю данные из своего API, и он возвращает список типа Event. Ниже показана структура:
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 возвращает Map<DateTime, List<dynamic>>
.
По сути, все, что я хочу, - это чтобы данные, возвращаемые из API, использовались при заполнении событий. в календаре. Я открыт для любых идей, чтобы заставить это работать. Я вставил вызов асинхронной функции в initState (), так как данные необходимы для загрузки календаря вместе с ним.
Я открыт для любых предложений, довольно отчаянно на данный момент, так как у меня естькрайний срок для этого. Любая помощь будет высоко ценится!