Я использую 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
, как это сделать во Flutter?
Я хочу продолжать использовать ScopedModel
для управления состоянием во Flutter.
Возможное решение
Я подумал, что решением будет хранить события в List<Event>
, как я это делаю. Затем при вызове fetchEvents()
я мог бы сначала проверить, не является ли мой List<Event>
нулевым, если да, мне не нужно вызывать его снова, потому что данные уже были загружены.
Это кажется мне плохим решением, особенно когда у меня есть несколько страниц, извлекающих данные. Предположим, я загружаю первый, когда я перехожу ко второму, он предполагает, что данные уже загружены, потому что List<Event>
не равно нулю, и он не будет загружаться снова.