首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在应用重启之间保存和恢复Flutter ListView的滚动位置?

如何在应用重启之间保存和恢复Flutter ListView的滚动位置?
EN

Stack Overflow用户
提问于 2019-09-12 16:40:43
回答 3查看 892关注 0票数 2

我希望保留ListView的滚动位置,以便在应用程序重启之间恢复它。

所以我想应该用shared_preferences ( iOS上的NSUserDefaults和安卓上的SharedPreferences )把它保存在磁盘上。

有没有内置的方法(或插件)来做到这一点?

如果我必须手动操作,我应该在什么时候保存滚动位置?(在原生安卓应用程序中,我将在onPause活动生命周期方法中执行此操作。)

我搜索了很多,但我似乎找不到任何帖子或示例代码来说明如何保存和恢复ListView的滚动位置。

EN

回答 3

Stack Overflow用户

发布于 2019-09-12 17:51:56

如果我必须手动操作,我应该在什么时候保存滚动位置?(在原生安卓应用程序中,我将在onPause活动生命周期方法中执行此操作。)

您可以通过侦听AppLifecycleState来使用mixin WidgetsBindingObserver来检测应用程序何时转到后台以及何时转到前台

可观察的生命周期事件包括:

  • paused -应用程序当前对用户不可见,不响应用户输入,并在后台运行。这就像Android
  • inactive中的onPause() -应用程序处于非活动状态,不接收用户输入。(仅限IOS)
  • 已恢复-应用程序可见并响应用户输入。这就像Android
  • suspending中的onPostResume() -应用程序将被暂时挂起。(仅限安卓)

在示例中,我保存日期而不是滚动位置

代码语言:javascript
复制
class _TestPageState extends State<TestPage> with WidgetsBindingObserver {

  SharedPreferences prefs;

  @override
  void initState() {
    WidgetsBinding.instance.addObserver(this);
    super.initState();
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    print('state = $state'); // resumed, paused, inactive, suspending
    if (state == AppLifecycleState.paused) {
        prefs.setString('date', DateTime.now().toIso8601String());
    }
  }

  _TestPageState() {
    initPrefs();
  }

  void initPrefs() async {
    prefs = await SharedPreferences.getInstance();
    print(prefs.getString('date') ?? 'no date');
  }
  ...
票数 1
EN

Stack Overflow用户

发布于 2021-01-17 02:51:50

我们现在对Flutter中的状态恢复提供了开箱即用的支持。查看ScrollView小部件中的restorationId属性。查看此链接,了解如何在Flutter中实现恢复。https://dev.to/pedromassango/what-is-state-restoration-and-how-to-use-it-in-flutter-5blm

票数 1
EN

Stack Overflow用户

发布于 2019-09-12 17:24:26

正如你在问题中所说的-使用https://pub.dev/packages/shared_preferences是最好的选择,因为它利用了原生的方式来处理这些东西--安卓系统的SharedPreferences和iOs系统的NSUserDefaults。在Android中使用的新方法是PersistentBundle,它也可以在flutter中使用,但没有类似的iOs版本。此外,您可以使用所有类型的数据库和文件存储,但在这种情况下,这将是过度杀伤力。

在移动设备上,存储滚动状态一直是一项手动任务--没有开箱即用的快捷方式--所以只有手工制作的东西或库。

您可以将有状态小部件的整个状态存储在那里,然后将其作为一个整体进行恢复。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57902923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档