簡體   English   中英

如何在應用程序重新啟動之間保存和恢復 Flutter ListView 的滾動位置?

[英]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來檢測您的應用何時進入后台以及何時進入前台

可觀察的生命周期事件是:

  • paused — 應用程序當前對用戶不可見,不響應用戶輸入,並在后台運行。 就像 Android 中的onPause()
  • 非活動 - 應用程序處於非活動狀態且未接收用戶輸入。 (僅限IOS)
  • resumed — 應用程序可見並響應用戶輸入。 就像 Android 中的onPostResume()
  • suspending — 應用程序將暫時暫停。 (僅限安卓)

在示例中,我保存日期而不是滾動位置

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 的SharedPreferencesNSUserDefaults 在 Android 中實現PersistentBundle的新方法也可以在 Flutter 中使用,但沒有適用於 iO 的模擬。 您也可以使用各種數據庫和文件存儲,但在這種情況下它會過大。

存儲滾動狀態始終是移動設備上的手動任務 - 沒有開箱即用的快捷方式 - 所以只有手工制作的東西或庫。

您可以在那里存儲有狀態小部件的整個狀態,然后將其作為一個整體恢復。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM