initState()总是在页面初始化时调用,这很好。
但是,如果我有两个屏幕
屏幕1导航到屏幕2,现在,当你按回第2页(弹出)时,第1页是否有一个事件知道我们又回来了?
换句话说,屏幕1能否在回按第2页时触发一个事件?
这对于设置比如说全局变量的状态是很有用的,它在屏幕2上改变了,所以屏幕1可以相应地更新
你可以 await
Navigator.push()
路由被弹出时,会被解析。
在Screen1中。
await Navigator.push(context, Screen2);
// Do something when Screen2 is popped
也可以从 Screen2
到 Screen1
与 pop()
:
在屏幕2:
Navigator.pop(context, data);
在屏幕1中。
final dataFromScreen2 = await Navigator.push(context, Screen2);
你可以通过3种不同的方式来制作,具体取决于你想要什么。
1.popEvents(我最喜欢的)。你可以使用 WillPopScope
小部件,以防止后退按钮退出页面。
@override
Widget build(BuildContext context) {
return WillPopScope(
onWillPop: (){
return Future.value(a==b); //Replace by your conditionnals here. false means you're block back action for this page
},
child: Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
),)
);
}
1.只监听page2(只有当你想检查Page1上的执行代码时)
-page2:只有当你想根据page2的结果在Page1上执行你的代码时才需要这个。
Navigator.pop(data);//this is the data you want to send back to Page1
//if user presses back button, it's same like Navigator.pop(null)
-Page1:使用Page2发送的代码。
final result = await Navivigator.push(MaterialPageRoute(builder: (ctx)=>Page2()));
if(result!=null){
//do somthing
}
3. 你要监听整个应用的生命周期事件。这样,当用户回到Page1时,你可以随时检查任务是否被正确执行。
-启动绑定
WidgetsFlutterBinding.ensureInitialized();
-在第一页增加 WidgetsBindingObserver
混入您的页面
class Page1State extends State<Page1> with WidgetsBindingObserver
-覆盖 didChangeAppLicycleState
方法:这将传递你的页面的当前状态或整个应用程序的状态事件,如去后台......。
@override
void didChangeAppLicycleState(AppLifecycleState state){
if(state = AppLifecycleState.paused){
//do whatever you want here
}
}