当用户运行移动应用然后选择另一个应用运行时,第一个应用会被移到后台,或称为“后台化”。操作系统(iOS 和 Android)可能会终止后台应用以释放内存并提高前台应用的性能。

当用户再次选择该应用,将其带回前台时,操作系统会重新启动它。但是,除非您设置了在应用被终止前保存应用状态的方法,否则您将丢失状态,应用将从头开始。用户将失去他们期望的连续性,这显然不是理想的。(想象一下,在填写一个冗长的表单后,在点击 **提交** *之前* 接到了一个电话。)

那么,如何恢复应用的状态,使其看起来与后台化之前一样呢?

Flutter 在 services 库中提供了 RestorationManager(及相关类)来解决这个问题。通过 RestorationManager,Flutter 框架会在状态改变时将状态数据提供给引擎,以便在操作系统发出即将终止应用的信号时,应用已准备就绪,只给应用几秒钟的准备时间。

概述

#

只需几个步骤即可启用状态恢复

  1. 为所有支持的 widget(如 TextFieldScrollView)定义一个 restorationIdrestorationScopeId。这会自动为这些 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(及其子项)将数据存储在周围的 bucket 中。

恢复导航状态

#

如果您希望您的应用返回到用户最近查看的特定路由(例如购物车),那么您也必须为导航实现恢复状态。

如果您直接使用 Navigator API,请将标准方法迁移到可恢复方法(名称中带有“restorable”)。例如,用 restorablePush 替换 push

VeggieSeasons 示例(在下面的“其他资源”下列出)使用 go_router 包实现导航。restorationId 值的设置发生在 lib/screens 类中。

测试状态恢复

#

要测试状态恢复,请设置您的移动设备,使其在应用后台化时不会保存状态。要了解如何在 iOS 和 Android 上执行此操作,请查看 RestorationManager 页面上的 测试状态恢复

其他资源

#

有关状态恢复的更多信息,请参阅以下资源