跳到主要內容

在 Android 上還原狀態

當使用者執行行動應用程式,然後選擇執行另一個應用程式時,第一個應用程式會移至背景,或稱為背景化。作業系統(iOS 和 Android)可能會終止背景化的應用程式,以釋放記憶體並提高前景執行應用程式的效能。

當使用者再次選擇該應用程式,將其帶回前景時,作業系統會重新啟動它。但是,除非您設定了在應用程式被終止前儲存其狀態的方法,否則您會失去狀態,且應用程式會從頭開始。使用者會失去他們所期望的連續性,這顯然不理想。(想像一下,在點擊提交之前,您正在填寫冗長的表單,卻被電話打斷。)

那麼,您如何還原應用程式的狀態,使其看起來像是在被送到背景之前的樣子呢?

Flutter 在 services 函式庫中,透過 RestorationManager(以及相關類別)為此提供了解決方案。透過 RestorationManager,Flutter 框架會在狀態變更時將狀態資料提供給引擎,以便在作業系統發出訊號表示即將終止應用程式時,應用程式能夠準備好,僅給予應用程式短暫的準備時間。

概觀

#

您只需幾個任務即可啟用狀態還原

  1. 為所有支援的 Widget 定義 restorationIdrestorationScopeId,例如 TextFieldScrollView。這會自動啟用這些 Widget 的內建狀態還原功能。

  2. 對於自訂 Widget,您必須決定要還原哪些狀態,並將該狀態保留在 RestorableProperty 中。(Flutter API 為不同的資料類型提供各種子類別。)在使用 RestorationMixinState 類別中定義這些 RestorableProperty Widget。在 restoreState 方法中向 mixin 註冊這些 Widget。

  3. 如果您使用任何 Navigator API(例如 pushpushNamed 等),請遷移至名稱中包含「restorable」的 API(restorablePushrestorablePushNamed 等),以還原導覽堆疊。

其他考量

  • MaterialAppCupertinoAppWidgetsApp 提供 restorationId 會透過注入 RootRestorationScope 自動啟用狀態還原。如果您需要在應用程式類別之上還原狀態,請手動注入 RootRestorationScope

  • restorationIdrestorationScopeId 之間的差異:採用 restorationScopeID 的 Widget 會建立新的 restorationScope(新的 RestorationBucket),所有子項都會將其狀態儲存在其中。restorationId 表示 Widget(及其子項)將資料儲存在周圍的儲存桶中。

還原導覽狀態

#

如果您希望您的應用程式返回使用者最近檢視的特定路由(例如購物車),那麼您也必須實作導覽的還原狀態。

如果您直接使用 Navigator API,請將標準方法遷移至可還原的方法(名稱中包含「restorable」)。例如,將 push 替換為 restorablePush

VeggieSeasons 範例(列於下方「其他資源」中)使用 go_router 套件實作導覽。restorationId 值的設定發生在 lib/screens 類別中。

測試狀態還原

#

若要測試狀態還原,請設定您的行動裝置,使其在應用程式背景化後不會儲存狀態。若要了解如何在 iOS 和 Android 上執行此操作,請查看 RestorationManager 頁面上的測試狀態還原

其他資源

#

如需狀態還原的更多資訊,請查看以下資源