我的底部导航菜单中有 4 个不同的项目,在一种情况下,我需要导航到一个页面并删除堆栈中的所有页面,以便我使用此代码导航另一个屏幕;
Navigator.pushAndRemoveUntil(
context,
PageRouteBuilder(
pageBuilder: (context, anim1, anim2) => AnamenuTemelSayfa(currentIndex: 2),
transitionsBuilder: (context, anim1, anim2, child) => Container(child: child),
transitionDuration: Duration(milliseconds: 200),
),
(_) => true,
);
在这次导航之后,当我点击物理设备上的后退按钮时,它会回到我刚刚来的最后一个屏幕,为了解决这个问题,我将 true 值更改为 false,但是当我在物理设备上应用程序的任何页面中执行此导航事件后执行此操作时,后退按钮不起作用,所以我尝试做另一件事是用 WillPopScope 包装第二页不是回去,我已经定义了这段代码;
//Second page
onWillPop: () async {
return await Future.value(false);
},
如果你想使用willpopscope,你应该使用Navigator.push
而不是Navigator.pushAndRemoveUntil
pushAndRemove直到删除所有页面,直到当前页面,然后你不能回到上一页并且你的WillPopScope不调用,所以如果你想阻止用户回到上一页,你应该用WillPopScope小部件包装你的脚手架,如下所示:
WillPopScope(
onWillPop: () async => false,
child: Scaffold(
// your code here
)
)
编辑:使用此导航器(删除所有页面,直到您的新页面(
Navigator.pushAndRemoveUntil(context, MaterialPageRoute(builder: (BuildContext context){
return YourNewPage();
}), (Route<dynamic> route) => false);
路由谓词应返回false
以删除所有上一页并推送新页面。
Navigator.pushAndRemoveUntil(
context,
PageRouteBuilder(
pageBuilder: (context, anim1, anim2) => AnamenuTemelSayfa(currentIndex: 2),
transitionsBuilder: (context, anim1, anim2, child) => Container(child: child),
transitionDuration: Duration(milliseconds: 200),
),
(_) => false, // routePredicate
);
现在你不需要使用WillPopScope
.