Я использую ScopedModel для получения некоторых данных из базы данных Firebase.
Я получаю список событий.
- Я получаю события из конечной точки внутри Модели;
- Я сохраняю события в
List<Event>
внутри модели;
- Я использую этот список для построения
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>
не ноль, и он не будет загружаться снова.