我希望保留ListView的滚动位置,以便在应用程序重启之间恢复它。
所以我想应该用shared_preferences ( iOS上的NSUserDefaults和安卓上的SharedPreferences )把它保存在磁盘上。
有没有内置的方法(或插件)来做到这一点?
如果我必须手动操作,我应该在什么时候保存滚动位置?(在原生安卓应用程序中,我将在onPause活动生命周期方法中执行此操作。)
我搜索了很多,但我似乎找不到任何帖子或示例代码来说明如何保存和恢复ListView的滚动位置。
发布于 2019-09-12 17:51:56
如果我必须手动操作,我应该在什么时候保存滚动位置?(在原生安卓应用程序中,我将在onPause活动生命周期方法中执行此操作。)
您可以通过侦听AppLifecycleState来使用mixin WidgetsBindingObserver来检测应用程序何时转到后台以及何时转到前台
可观察的生命周期事件包括:
onPause() -应用程序处于非活动状态,不接收用户输入。(仅限IOS)onPostResume() -应用程序将被暂时挂起。(仅限安卓)在示例中,我保存日期而不是滚动位置
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');
}
...发布于 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
发布于 2019-09-12 17:24:26
正如你在问题中所说的-使用https://pub.dev/packages/shared_preferences是最好的选择,因为它利用了原生的方式来处理这些东西--安卓系统的SharedPreferences和iOs系统的NSUserDefaults。在Android中使用的新方法是PersistentBundle,它也可以在flutter中使用,但没有类似的iOs版本。此外,您可以使用所有类型的数据库和文件存储,但在这种情况下,这将是过度杀伤力。
在移动设备上,存储滚动状态一直是一项手动任务--没有开箱即用的快捷方式--所以只有手工制作的东西或库。
您可以将有状态小部件的整个状态存储在那里,然后将其作为一个整体进行恢复。
https://stackoverflow.com/questions/57902923
复制相似问题