Flutter - есть ли способ заполнять события из моего API в атрибут 'events' TableCalendar - PullRequest
0 голосов
/ 28 октября 2019

Я потратил целую вечность, просматривая столько вопросов о стековом потоке, чтобы найти решение, но у меня нет идей. По сути, я загружаю данные из своего 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 (), так как данные необходимы для загрузки календаря вместе с ним.

Я открыт для любых предложений, довольно отчаянно на данный момент, так как у меня естькрайний срок для этого. Любая помощь будет высоко ценится!

1 Ответ

0 голосов
/ 28 октября 2019

Можете ли вы объяснить это?

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

Я вижу, что вы просматриваете _eventList и внутри цикла, который вы добавляете в тот же список _eventList.add(e);

Я определенно могу помочь, если вы сможете объяснить больше, где вы застряли.

...