我尝试在关闭应用程序后恢复状态,当使用调试模式且不保留活动时,应用程序正常运行并且应用程序的状态已恢复。但是当我从切换应用程序菜单中滑动应用程序后,状态就消失了。
我想在从切换应用程序菜单关闭应用程序后恢复状态应用程序。有人可以解释一下恢复 mixin 是如何工作的吗?谢谢你。
Flutter 中的
RestorationStateMixin
旨在帮助您的应用程序被终止然后恢复时,或者当其进程被系统终止并重新创建时(例如,在使用“不保留活动”设置时)恢复状态安卓)。但是,此机制不会在应用程序完全终止时保留状态,例如当您从最近使用的应用程序菜单中滑动应用程序或重新启动设备时。这种行为是预期的,因为将应用程序从切换器菜单中滑出被视为“硬杀”,这不会像系统暂时从内存中删除应用程序时那样触发状态恢复。
借助 RestorationManager,Flutter 框架会在状态发生变化时向引擎提供状态数据,以便当操作系统发出即将终止应用程序的信号时应用程序已准备就绪,只给应用程序一些准备时间。
请参阅:在 Android 上恢复状态
RestorationStateMixin
如何运作:RestorationStateMixin
允许在系统终止和恢复应用程序时自动保存和恢复小部件的状态。这通常用于临时保存瞬态 UI 状态(例如表单输入、滚动位置)而不是持久数据。以下是其工作原理的基本概述:
注册可恢复值:您可以注册可恢复值,如
RestorableInt
、RestorableBool
等,当应用程序恢复时,这些值将自动恢复。使用它们代替标准变量以允许 Flutter 管理它们。
恢复ID:每个参与状态恢复的小部件都需要一个唯一的
restorationId
。这允许 Flutter 跟踪它应该恢复 UI 状态的哪一部分。
可恢复状态:您需要使用
RestorableProperty
对象(如RestorableInt
、RestorableString
)来表示要保存和恢复的状态。只要应用程序没有被用户完全杀死,Flutter 就会在进程重新启动时保存和恢复值。
可以在此处找到演示如何使用
RestorationStateMixin
的最小示例:https://api.flutter.dev/flutter/widgets/RestorationMixin-mixin.html
当您将应用程序从应用程序切换器上滑开时,操作系统会完全终止该应用程序。这不会让应用程序有机会保存任何状态。像
RestorationStateMixin
这样的状态恢复机制用于在系统启动的进程终止后恢复 UI 状态,而不是在用户启动的终止后恢复 UI 状态。
要在此类应用程序终止时保持状态,您需要将状态存储在持久存储中,例如共享首选项、本地数据库(例如,
sqflite
)或云后端。您可以将这些存储中的状态保存在应用程序的生命周期事件(例如AppLifecycleState.paused
)中,并在应用程序再次启动时重新加载。
这是一个使用
SharedPreferences
来保存计数器值的示例:
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
void main() {
runApp(const MaterialApp(home: MyPersistentApp()));
}
class MyPersistentApp extends StatefulWidget {
@override
_MyPersistentAppState createState() => _MyPersistentAppState();
}
class _MyPersistentAppState extends State<MyPersistentApp> {
int _counter = 0;
@override
void initState() {
super.initState();
_loadCounter();
}
_loadCounter() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
setState(() {
_counter = (prefs.getInt('counter') ?? 0);
});
}
_incrementCounter() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
setState(() {
_counter++;
});
prefs.setInt('counter', _counter);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Persistent Counter'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('You have pushed the button this many times:'),
Text(
'$_counter',
style: Theme.of(context).textTheme.headline4,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
}