didChangeAppLifecycleState 没有按预期工作
didChangeAppLifecycleState doesn't work as expected
我希望我理解 didChangeAppLifecycleState
是如何正确工作的。
我有页面 A 和页面 B。当我从页面 B ( Navigator.of(context).pop();
) 单击后退设备按钮时,我希望页面 A 中的 didChangeAppLifecycleState
会被调用,但它不会。
A页
class _ABCState extends State<ABCrList> 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) {
if (state == AppLifecycleState.resumed) {
setState(() {
print(...);
});
}else{
print(state.toString());
}
}
....
这是页面 A 中的 initState
。用于调用后端服务的函数。
@override
void initState() {
super.initState();
_bloc.getList(context); // return list and populate to ListView
});
}
您认为的方式是 Android 的方式,而 onResume
的工作方式,但在 Flutter 中,事情不会以这种方式发生。
通常,当系统将应用程序置于后台或 returns 将应用程序置于前台时会调用此方法。
主要有4种状态:
resumed
: 应用程序可见并响应用户输入。
inactive
: 应用程序处于非活动状态,未接收用户输入。
paused
: 该应用程序当前对用户不可见,不响应用户输入,并且在后台运行。
detached
:该应用程序仍然托管在 Flutter 引擎上,但与任何主机视图分离。
编辑:
当您从 PageA
导航到 PageB
时,请使用如下内容:
Navigator.pushNamed(context, "/pageB").then((flag) {
if (flag) {
// you're back from PageB, perform your function here
setState(() {}); // you may need to call this if you want to update UI
}
});
在 PageB 中,您可以使用
Navigator.pop(context, true);
我希望我理解 didChangeAppLifecycleState
是如何正确工作的。
我有页面 A 和页面 B。当我从页面 B ( Navigator.of(context).pop();
) 单击后退设备按钮时,我希望页面 A 中的 didChangeAppLifecycleState
会被调用,但它不会。
A页
class _ABCState extends State<ABCrList> 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) {
if (state == AppLifecycleState.resumed) {
setState(() {
print(...);
});
}else{
print(state.toString());
}
}
....
这是页面 A 中的 initState
。用于调用后端服务的函数。
@override
void initState() {
super.initState();
_bloc.getList(context); // return list and populate to ListView
});
}
您认为的方式是 Android 的方式,而 onResume
的工作方式,但在 Flutter 中,事情不会以这种方式发生。
通常,当系统将应用程序置于后台或 returns 将应用程序置于前台时会调用此方法。
主要有4种状态:
resumed
: 应用程序可见并响应用户输入。
inactive
: 应用程序处于非活动状态,未接收用户输入。
paused
: 该应用程序当前对用户不可见,不响应用户输入,并且在后台运行。
detached
:该应用程序仍然托管在 Flutter 引擎上,但与任何主机视图分离。
编辑:
当您从 PageA
导航到 PageB
时,请使用如下内容:
Navigator.pushNamed(context, "/pageB").then((flag) {
if (flag) {
// you're back from PageB, perform your function here
setState(() {}); // you may need to call this if you want to update UI
}
});
在 PageB 中,您可以使用
Navigator.pop(context, true);