在Flutter中使用ScopedModel时如何保留数据?

时间:2019-07-05 14:46:25

标签: flutter scoped-model

我正在使用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>是否不为null,因为已经加载了数据,所以我不需要再次调用它。

这对我来说似乎是一个不好的解决方案,尤其是当我有多个页面正在提取数据时。假设我加载了第一个,当我进入第二个时,它将假设数据已经加载,因为List<Event>不为null,并且不会再次加载。

1 个答案:

答案 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;
}