[英]How can I save and restore the scroll position of a Flutter ListView between app restarts?
我想保留 ListView 的滾動位置,以便在應用程序重新啟動之間恢復它。
所以我想它應該使用類似shared_preferences
東西保存在磁盤上(在 iOS 上的 NSUserDefaults 和 Android 上的 SharedPreferences 中)
有沒有內置的方式(或插件)來做到這一點?
如果我必須手動完成,我應該什么時候保存滾動位置? (在本機 Android 應用程序中,我會在onPause
Activity 生命周期方法中執行此操作。)
我搜索了很多,似乎找不到任何顯示如何保存和恢復 ListView 滾動位置的帖子或示例代碼。
如果我必須手動完成,我應該什么時候保存滾動位置? (在本機 Android 應用程序中,我會在 onPause Activity 生命周期方法中執行此操作。)
您可以使用 mixin WidgetsBindingObserver通過監聽AppLifecycleState來檢測您的應用何時進入后台以及何時進入前台
可觀察的生命周期事件是:
onPause()
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');
}
...
我們現在對 Flutter 中的狀態恢復提供了開箱即用的支持。 退房restorationId
內財產ScrollView
部件。 查看此鏈接以了解如何在 Flutter 中實現恢復。 https://dev.to/pedromassango/what-is-state-restoration-and-how-to-use-it-in-flutter-5blm
正如您在問題中所說 - 使用https://pub.dev/packages/shared_preferences是最好的選擇,因為它利用了處理此類內容的本機方式 - Android 的SharedPreferences
和NSUserDefaults
。 在 Android 中實現PersistentBundle
的新方法也可以在 Flutter 中使用,但沒有適用於 iO 的模擬。 您也可以使用各種數據庫和文件存儲,但在這種情況下它會過大。
存儲滾動狀態始終是移動設備上的手動任務 - 沒有開箱即用的快捷方式 - 所以只有手工制作的東西或庫。
您可以在那里存儲有狀態小部件的整個狀態,然后將其作為一個整體恢復。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.