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