Flutter中根据调用屏幕调整Navigator.pop行为的实现方案
下面提供两种简单易懂的实现方案,适合刚学习Flutter的开发者:
方法1:给方法添加调用来源标识参数
这种方式逻辑直接清晰,通过显式传递参数告诉方法是哪个页面触发的调用,后期维护也方便。
修改后的方法代码
// 用可选参数区分调用方,也可以用枚举提升可读性 void salvarCartao(InputCartaoDto cartao, BuildContext context, {bool isFromPaymentCart = false}) async { var cartaoDto = await AdicionarCartaoCommand().execute(cartao, context); if (cartaoDto != null) { var usuarioCorrente = await ObterUsuarioCorrenteCommand().execute(); var listaCartoes = usuarioCorrente?.cartoes; listaCartoes?.add(cartaoDto); AtualizarUsuarioCommand().execute(usuarioCorrente!); } if (isFromPaymentCart) { // 第二个页面调用时,回到指定路由 Navigator.popUntil(context, ModalRoute.withName('/carrinho-pagamento')); } else { // 第一个页面调用时,执行普通pop Navigator.pop(context); } }
调用方式
- 第一个页面调用:
salvarCartao(cartao, context); // 默认isFromPaymentCart为false
- 第二个页面调用:
salvarCartao(cartao, context, isFromPaymentCart: true);
如果想让代码更规范,也可以定义枚举替代bool参数:
enum CallerPage { normal, paymentCart } void salvarCartao(InputCartaoDto cartao, BuildContext context, {required CallerPage caller}) async { // 原有业务逻辑... switch(caller) { case CallerPage.normal: Navigator.pop(context); break; case CallerPage.paymentCart: Navigator.popUntil(context, ModalRoute.withName('/carrinho-pagamento')); break; } }
方法2:通过上下文自动判断当前路由
如果不想额外修改调用逻辑,可以通过上下文获取当前页面的路由名称,自动执行对应操作:
void salvarCartao(InputCartaoDto cartao, BuildContext context) async { var cartaoDto = await AdicionarCartaoCommand().execute(cartao, context); if (cartaoDto != null) { var usuarioCorrente = await ObterUsuarioCorrenteCommand().execute(); var listaCartoes = usuarioCorrente?.cartoes; listaCartoes?.add(cartaoDto); AtualizarUsuarioCommand().execute(usuarioCorrente!); } // 获取当前页面的路由名称(替换成你第二个页面的实际路由名) final currentRoute = ModalRoute.of(context)?.settings.name; if (currentRoute == '/your-second-page-route') { Navigator.popUntil(context, ModalRoute.withName('/carrinho-pagamento')); } else { Navigator.pop(context); } }
注意:需要把代码中的'/your-second-page-route'替换成第二个页面的真实路由名称,这种方式依赖路由名称的准确性,若后续路由名称变更需要同步修改此处判断。
内容的提问来源于stack exchange,提问作者Lucas Benevenute
相关产品推荐
相关产品推荐

