【发布时间】:2021-05-21 01:58:17
【问题描述】:
我正在编写一个面向移动设备的 Flutter 应用。我已经习惯了 Android 范例,您可以在 onPause 中保留用户所做的所有更改,这基本上是在当前屏幕进入后台时调用的。我找不到 Flutter 等价物。
我看到的所有示例都有一个“提交”按钮,但我希望应用程序在我按下返回或主页按钮(或者如果我按下应用程序栏中的保存图标)时保存数据。
Flutter 应用程序通常在哪里将状态保存到存储中?
【问题讨论】:
我正在编写一个面向移动设备的 Flutter 应用。我已经习惯了 Android 范例,您可以在 onPause 中保留用户所做的所有更改,这基本上是在当前屏幕进入后台时调用的。我找不到 Flutter 等价物。
我看到的所有示例都有一个“提交”按钮,但我希望应用程序在我按下返回或主页按钮(或者如果我按下应用程序栏中的保存图标)时保存数据。
Flutter 应用程序通常在哪里将状态保存到存储中?
【问题讨论】:
您可以使用WidgetsBindingObserver 获取AppLifecycleState.paused:
class MyPage extends StatefulWidget {
@override
_MyPageState createState() => _MyPageState();
}
class _MyPageState extends State<MyPage> with WidgetsBindingObserver {
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
super.didChangeAppLifecycleState(state);
switch (state) {
case AppLifecycleState.resumed:
break;
case AppLifecycleState.inactive:
break;
case AppLifecycleState.paused:
_saveState();
break;
case AppLifecycleState.detached:
break;
}
}
void _saveState() {
// Save state here
}
@override
Widget build(BuildContext context) => Scaffold(
body: WillPopScope(
onWillPop: () async {
_saveState();
return true;
},
child: SafeArea(
child: Container(),
),
),
);
}
另一个选项是使用hydrated_bloc,它会自动为您保存状态。
【讨论】:
didChangeAppLifecycleState() - 我尝试单击左上角的箭头,这基本上将路由从堆栈中弹出。我在addObserver 上设置了一个断点,它会被调用。
onPause() 中。 Flutter 是否没有可供所有应用使用的类似模式?