Как сохранить данные при использовании ScopedModel во Flutter?

Я использую ScopedModel для извлечения некоторых данных из базы данных Firebase.

Я получаю список событий.

  1. Я получаю события из конечной точки внутри модели;
  2. Я сохраняю события в List<Event> внутри модели;
  3. Я использую этот список для создания своего ListView.
mixin EventModel on Model {
    List<Event> _events = [];

    Future<http.Response> fetchEvents() async {
          http.Response response = await http.get(//Url);

            final List<Event> fetchedEvents = [];

            ... // decode response data into fetchedEvents

            // Add the loaded data to my List
            _events = fetchedEvents;
            notifyListeners();

            ...
      }

}

Итак, при открытии EventsPage первое, что я делаю, это извлекаю данные из initState().

class _EventPageState extends State<EventPage> {
  @override
  void initState() {
    super.initState();
      widget.model.fetchEvents();
    }
  }
}

После извлечения сетевых данных мой List внутри моего приложения имеет сетевые данные, поэтому я могу использовать их для создания своего ListView.

EventsPage.dart

Widget _buildListView(MainModel model) {
    return Center(
      child: ListView.builder(
        itemBuilder: (BuildContext context, int index) {
          return ItemEventBig(model.events[index], index);
        },
        itemCount: model.events.length,
      ),
    );
  }

Моя проблема в том, что если я перейду на другую страницу, а затем вернусь к EventsPage, initState() будет вызван снова, поэтому fetchEvents. Заставить приложение снова перезагрузить список всех событий.

Я хотел бы сохранить загруженные данные, пока мое приложение живо, поэтому, если пользователь вернется и вернется к EventsPage, данные не будут потеряны.

Я привык делать это в Android с помощью ViewModel, как это сделать во Flutter?

Я хочу продолжать использовать ScopedModel для управления состоянием во Flutter.

Возможное решение

Я подумал, что решением будет хранить события в List<Event>, как я это делаю. Затем при вызове fetchEvents() я мог бы сначала проверить, не является ли мой List<Event> нулевым, если да, мне не нужно вызывать его снова, потому что данные уже были загружены.

Это кажется мне плохим решением, особенно когда у меня есть несколько страниц, извлекающих данные. Предположим, я загружаю первый, когда я перехожу ко второму, он предполагает, что данные уже загружены, потому что List<Event> не равно нулю, и он не будет загружаться снова.


person Soon Santos    schedule 05.07.2019    source источник


Ответы (1)


См. документацию по Flutter — https://api.flutter.dev/flutter/widgets/AutomaticKeepAliveClientMixin-mixin.html

class _EventPageState extends State<EventPage> 
     with AutomaticKeepAliveClientMixin<EventPage> {
  @override
  void initState() {
    super.initState();
      widget.model.fetchEvents();
    }
  }
  @override
  // TODO: implement wantKeepAlive
  bool get wantKeepAlive => true;
}
person Aaron Saunders    schedule 07.07.2019
comment
Это решает проблему, так как сохраняет состояние и больше не вызывает initState() при смене вкладок. Необходимо поместить super.build(context); в ваш метод build(), иначе он отобразит предупреждение. - person Soon Santos; 02.08.2019