【问题标题】:Flutter - Is there a way to populate events from my API to TableCalendar's 'events' attributeFlutter - 有没有办法将事件从我的 API 填充到 TableCalendar 的“事件”属性
【发布时间】: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&lt;DateTime, List&lt;dynamic&gt;&gt;

基本上,我想要从 API 返回的数据用于填充日历中的事件。我对任何想法持开放态度,以使其发挥作用。我在 initState() 中插入了对异步函数的调用,因为需要数据来加载日历。

我对任何建议都持开放态度,在这一点上非常绝望,因为我有一个截止日期。任何帮助将不胜感激!

【问题讨论】:

    标签: asynchronous flutter dart future


    【解决方案1】:

    如果您因_events 为空而收到错误,则表示 Map 有值。您可以做的解决方法是使用Map&lt;DateTime, List&gt; _events = {}; 初始化地图。使用这种方法,Map 可以为空但不为 null,并且可以在您稍后能够从 API 获取事件时填充。

    【讨论】:

      猜你喜欢
      • 2017-04-27
      • 2023-02-02
      • 2023-04-10
      • 2010-11-24
      • 1970-01-01
      • 2021-07-16
      • 2014-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多