页面焦点事件时的颤动?

问题描述 投票:0回答:1

initState()总是在页面初始化时调用,这很好。

但是,如果我有两个屏幕

屏幕1导航到屏幕2,现在,当你按回第2页(弹出)时,第1页是否有一个事件知道我们又回来了?

换句话说,屏幕1能否在回按第2页时触发一个事件?

这对于设置比如说全局变量的状态是很有用的,它在屏幕2上改变了,所以屏幕1可以相应地更新

flutter dart state
1个回答
1
投票

你可以 await Navigator.push() 路由被弹出时,会被解析。

在Screen1中。

await Navigator.push(context, Screen2);
// Do something when Screen2 is popped

也可以从 Screen2Screen1pop() :

在屏幕2:

Navigator.pop(context, data);

在屏幕1中。

final dataFromScreen2 = await Navigator.push(context, Screen2);

1
投票

你可以通过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
   }
} 
© www.soinside.com 2019 - 2024. All rights reserved.