在 Android 上恢复状态
当用户运行移动应用然后选择运行另一个应用时,第一个应用将移至后台,或后台化。操作系统(iOS 和 Android)可能会终止后台应用以释放内存并提升前台运行应用的性能。
当用户再次选择该应用,将其带回前台时,操作系统会重新启动它。但是,除非您已设置一种方法来在应用被终止之前保存其状态,否则您已丢失该状态,并且应用将从头开始。用户已失去他们预期的连续性,这显然不是理想的。(想象一下在点击提交之前填写冗长的表单并被电话打断的情景。)
那么,如何恢复应用的状态,使其看起来像发送到后台之前一样呢?
Flutter 通过 RestorationManager
(及相关类)在 services 库中为此提供了解决方案。借助 RestorationManager
,Flutter 框架会在状态发生变化时将状态数据提供给引擎,以便当操作系统发出即将终止应用的信号时,应用已做好准备,从而只给应用留出几秒钟的时间来准备。
概述
您只需执行一些任务即可启用状态恢复
-
为所有支持它的控件(例如
TextField
和ScrollView
)定义一个restorationId
或restorationScopeId
。这会自动为这些控件启用内置状态恢复。 -
对于自定义控件,您必须决定要恢复什么状态,并将该状态保存在
RestorableProperty
中。(Flutter API 为不同的数据类型提供了各种子类。)在使用RestorationMixin
的State
类中定义这些RestorableProperty
控件。在restoreState
方法中使用 mixin 注册这些控件。 -
如果您使用任何 Navigator API(例如
push
、pushNamed
等),请迁移到名称中带有“restorable”的 API(restorablePush
、resstorablePushNamed
等),以恢复导航堆栈。
其他注意事项
-
向
MaterialApp
、CupertinoApp
或WidgetsApp
提供restorationId
会通过注入RootRestorationScope
自动启用状态恢复。如果您需要在应用程序类上方恢复状态,请手动注入RootRestorationScope
。 -
restorationId
和restorationScopeId
之间的区别:接受restorationScopeID
的控件会创建一个新的restorationScope
(一个新的RestorationBucket
),所有子控件都会将自己的状态存储其中。restorationId
表示控件(及其子控件)将数据存储在周围的存储桶中。
恢复导航状态
如果您希望您的应用程序返回到用户最近查看的特定路由(例如购物车),那么您还必须为导航实现恢复状态。
如果您直接使用 Navigator API,请将标准方法迁移到可恢复方法(名称中带有“restorable”)。例如,用 restorablePush
替换 push
。
“其他资源”下所列的 VeggieSeasons 示例通过 go_router
包实现了导航。restorationId
值的设置在 lib/screens
类中进行。
测试状态恢复
要测试状态恢复,请设置移动设备,以便在应用进入后台后不保存状态。要了解如何在 iOS 和 Android 上执行此操作,请查看 RestorationManager
页面上的 测试状态恢复。
其他资源
有关状态恢复的更多信息,请查看以下资源
- 有关实现状态恢复的示例,请查看 VeggieSeasons,这是一个使用 Cupertino 小组件为 iOS 编写的示例应用。iOS 应用需要在 Xcode 中进行 一些额外的设置,但恢复类在 iOS 和 Android 上的工作方式相同。
以下列表链接到 VeggieSeasons 示例的相关部分 -
要了解有关短期和长期状态的更多信息,请查看 区分临时状态和应用状态。
-
您可能需要查看 pub.dev 上执行状态恢复的包,例如
statePersistence
。 - 有关导航和
go_router
包的更多信息,请查看 导航和路由。