我有一个从底部选项卡导航调用的页面,它执行一个initState函数,然后我通过按钮点击导航到一个页面,其中包含详细信息和操作,但是当我单击后退按钮转到原始页面时, initState没有再次运行,我发现因为当你把一个放在顶部时Flutter没有销毁页面,因为NAV不在新页面上,因为它不在菜单中,如何在点击后再次运行initState按钮还是有另一种方法来监听从后退按钮导航并运行需要更新数据的代码吗?
任何帮助都会很棒。
答案 0 :(得分:7)
您可以覆盖AppBar
上的默认后退箭头,然后指定您想要返回的值,以便在调用Navigator.pop
时触发状态更改:
<强>伪代码强>
因此您需要在导航按钮的onPressed
回调
onPressed: ()async{
var nav = await Navigator.of(context).push(newRoute);
if(nav==true||nav==null){
//change the state
}
},
在你的新路线你应该有这样的东西
new AppBar(
leading: new IconButton(
icon: new Icon(Icons.arrow_back),
onPressed: (){Navigator.pop(context,true)}
),
我正在检查值null
或true
,因为当用户点击Android屏幕上的BackButton(屏幕底部的那个)时会返回null值。我也相信null也将与Flutter中的默认BackButton一起返回,因此您实际上不需要覆盖leading
属性,但我自己没有检查过,因此可能值得检查。
答案 1 :(得分:0)
您可以使用WillPopScope收听弹出窗口(创建一个小部件,该小部件注册用户否决尝试的回调,以关闭文档中的[ModalRoute]。->从文档中清除):
@override
Widget build(BuildContext context) {
return WillPopScope(
onWillPop: () {
print('Backbutton pressed (device or appbar button), do whatever you want.');
//trigger leaving and use own data
Navigator.pop(context, false);
//we need to return a future
return Future.value(false);
},
child: Scaffold(
...
),
);
}
希望我能正确回答您的问题,并且有帮助:)!