我正在使用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>
是否不为null,因为已经加载了数据,所以我不需要再次调用它。
这对我来说似乎是一个不好的解决方案,尤其是当我有多个页面正在提取数据时。假设我加载了第一个,当我进入第二个时,它将假设数据已经加载,因为List<Event>
不为null,并且不会再次加载。
答案 0 :(得分:0)
请参阅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;
}