在 Android 上還原狀態
當使用者執行行動應用程式,然後選擇執行另一個應用程式時,第一個應用程式會移至背景,或稱為背景化。作業系統(iOS 和 Android)可能會終止背景化的應用程式,以釋放記憶體並提高前景執行應用程式的效能。
當使用者再次選擇該應用程式,將其帶回前景時,作業系統會重新啟動它。但是,除非您設定了在應用程式被終止前儲存其狀態的方法,否則您會失去狀態,且應用程式會從頭開始。使用者會失去他們所期望的連續性,這顯然不理想。(想像一下,在點擊提交之前,您正在填寫冗長的表單,卻被電話打斷。)
那麼,您如何還原應用程式的狀態,使其看起來像是在被送到背景之前的樣子呢?
Flutter 在 services 函式庫中,透過 RestorationManager
(以及相關類別)為此提供了解決方案。透過 RestorationManager
,Flutter 框架會在狀態變更時將狀態資料提供給引擎,以便在作業系統發出訊號表示即將終止應用程式時,應用程式能夠準備好,僅給予應用程式短暫的準備時間。
概觀
#您只需幾個任務即可啟用狀態還原
為所有支援的 Widget 定義
restorationId
或restorationScopeId
,例如TextField
和ScrollView
。這會自動啟用這些 Widget 的內建狀態還原功能。對於自訂 Widget,您必須決定要還原哪些狀態,並將該狀態保留在
RestorableProperty
中。(Flutter API 為不同的資料類型提供各種子類別。)在使用RestorationMixin
的State
類別中定義這些RestorableProperty
Widget。在restoreState
方法中向 mixin 註冊這些 Widget。如果您使用任何 Navigator API(例如
push
、pushNamed
等),請遷移至名稱中包含「restorable」的 API(restorablePush
、restorablePushNamed
等),以還原導覽堆疊。
其他考量
為
MaterialApp
、CupertinoApp
或WidgetsApp
提供restorationId
會透過注入RootRestorationScope
自動啟用狀態還原。如果您需要在應用程式類別之上還原狀態,請手動注入RootRestorationScope
。restorationId
和restorationScopeId
之間的差異:採用restorationScopeID
的 Widget 會建立新的restorationScope
(新的RestorationBucket
),所有子項都會將其狀態儲存在其中。restorationId
表示 Widget(及其子項)將資料儲存在周圍的儲存桶中。
還原導覽狀態
#如果您希望您的應用程式返回使用者最近檢視的特定路由(例如購物車),那麼您也必須實作導覽的還原狀態。
如果您直接使用 Navigator API,請將標準方法遷移至可還原的方法(名稱中包含「restorable」)。例如,將 push
替換為 restorablePush
。
VeggieSeasons 範例(列於下方「其他資源」中)使用 go_router
套件實作導覽。restorationId
值的設定發生在 lib/screens
類別中。
測試狀態還原
#若要測試狀態還原,請設定您的行動裝置,使其在應用程式背景化後不會儲存狀態。若要了解如何在 iOS 和 Android 上執行此操作,請查看 RestorationManager
頁面上的測試狀態還原。
其他資源
#如需狀態還原的更多資訊,請查看以下資源
若要查看實作狀態還原的範例,請查看 VeggieSeasons,這是一個為 iOS 編寫的範例應用程式,使用 Cupertino Widget。iOS 應用程式需要在 Xcode 中進行一些額外的設定,但還原類別在 iOS 和 Android 上的運作方式相同。
以下清單連結至 VeggieSeasons 範例的相關部分若要深入了解短期和長期狀態,請查看區分暫時性狀態和應用程式狀態。
您可能想要查看 pub.dev 上執行狀態還原的套件,例如
statePersistence
。如需更多關於導覽和
go_router
套件的資訊,請查看導覽與路由。
除非另有說明,否則本網站上的文件反映了 Flutter 的最新穩定版本。頁面上次更新於 2024-06-04。 檢視原始碼 或 回報問題。