Flutter-有没有办法将事件从我的API填充到TableCalendar的'events'属性

时间:2019-10-28 01:38:33

标签: asynchronous flutter dart future

我花了很长时间研究尽可能多的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()中插入了对异步函数的调用,因为需要数据来加载日历。

我愿意接受任何建议,因为我有一个截止日期,所以在这一点上非常绝望。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

您能解释一下吗?

for(Event e in _eventList){
      _dates.add(e.eventDate);
      _eventList.add(e);
    }

我看到您正在遍历_eventList,在内部循环中您将添加到同一列表_eventList.add(e);

如果您能解释更多您遇到的困难,我绝对可以帮忙。