Как сохранить данные при использовании ScopedModel во Flutter? - PullRequest
0 голосов
/ 05 июля 2019

Я использую 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, как это сделать во Флаттере?

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

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

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

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

1 Ответ

0 голосов
/ 07 июля 2019

См. Документацию по флаттеру - 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;
}
...