我有一个从底部选项卡导航调用的页面,它执行 initState 函数,然后我通过按钮单击导航到一个页面,该页面包含详细信息和要执行的操作,但是当我单击后退按钮转到原始页面时,initState 不会再次运行,我发现因为 Flutter 不会破坏页面,当你把一个页面放在上面, 由于 NAV 不在新页面上,因为它不在菜单中,如何让 initState 在单击后退按钮时再次运行,或者是否有另一种方法可以侦听从后退按钮导航并运行需要更新数据的代码?
任何帮助都会很棒。
您可以使用 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(
...
),
);
}
希望我答对了你的问题,这对:)有所帮助!
您可以覆盖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 屏幕(屏幕底部的那个(上的后退按钮时,会返回空值。我也相信 null 也会使用 Flutter 中的默认 BackButton 返回,因此您实际上不需要覆盖 leading
属性,但我自己还没有检查过,所以可能值得检查。
//if you want to perform any operation on back button so you can use WillPopScope Widget and managed your code inside onWillpop method
@override
Widget build(BuildContext context) {
return WillPopScope(
child:Column()),
onWillPop: onBackPress);
}
// this is onBackPress method
Future<bool> onBackPress() {
// your code
return Future.value(false);
}
就我而言,只需调用 whenComplete(( 就足够了。看一下例子:
Navigator.push(context,
MaterialPageRoute(builder: (context) => const YourRoute()))
.whenComplete(() {
// Do something when back to previous state
});