假设我有三个屏幕:wallet
,payments
,add card
。当我在add card
屏幕上时,我想从堆栈弹出payments
屏幕,并将其导航到wallet
屏幕,而不使用navigator.push
点击图标加上设备的后退图标。
下面是屏幕流程:
wallet
屏幕上有一个按钮,导航到payments
屏幕,然后payments
屏幕上有一个按钮,导航到add card
屏幕。所以,现在我想当我在add card
屏幕上点击android的后退图标或add card
屏幕上的图标时,都应该导航到wallet
屏幕。
请告诉我怎么做。
从你的问题来看,你的导航堆栈应该如何看起来不是很清楚:payments
是堆栈中的第一个,你能从那里到add card
和wallet
吗?还是应该只存在一个?
我认为你可以使用pushReplacement
: https://api.flutter.dev/flutter/widgets/Navigator/pushReplacement.html
这样,它会自动将当前的路线替换为新的路线,你的后退按钮会直接关闭应用程序(或者回到之前的屏幕)。如果你想要一些自定义的行为,当后退按钮被按下时,你总是可以使用WillPopScope
: https://api.flutter.dev/flutter/widgets/WillPopScope-class.html
Navigator.removeRoute(context, MaterialPageRoute(builder: (context) => payments()));
在删除支付屏幕时使用此代码
请尝试下面的代码
- PopAndPushNamed→把当前的路由从导航器中弹出,把一个命名的路由推到它的位置。
它从导航堆栈弹出支付屏幕,只有钱包屏幕留在导航堆栈
Navigator.popAndPushNamed(context, '/addCard');
- PushNamedAndRemoveUntil ->它将具有给定名称(Wallets)的路由推送到导航器上,然后删除之前的所有路由,直到谓词返回true。这里使用的是一个RoutePredicate,它总是返回false (Route Route) =>假的。在这种情况下,除了推送的钱包路由外,它会删除所有路由。
//named
Navigator.of(context)
.pushNamedAndRemoveUntil('wallets', (Route<dynamic> route) => false);
//not named
Navigator.of(context).pushAndRemoveUntil(MaterialPageRoute(builder: (context) =>
Wallets()), (Route<dynamic> route) => false),
- PopUntil ->在最紧密地封装给定上下文的导航器上重复调用pop,直到谓词返回true。谓词可能适用于同样的路线如果不止一次的路线。willhandlepopinternal是true。要弹出到具有特定名称的路由,可以使用ModalRoute.withName返回的RoutePredicate。
Navigator.popUntil(context, ModalRoute.withName('/wallets'));
try this:
Navigator.pushReplacement()