Flutter中Stripe支付页面跳转不生效问题排查
问题分析与解决方案
你的问题核心是连续调用了两次pushReplacement——pushReplacement会直接替换当前页面为新页面,你刚把页面替换成StripePaymentScreen,紧接着又用VerifyEmailScreen替换了它,导致Stripe页面根本没机会展示。同时,当前Stripe页面的支付成功逻辑是返回注册页,也不符合你"先完成支付再跳验证"的需求。
1. 修复注册页面的跳转逻辑
删除注册成功后的第二次跳转,只保留跳转到Stripe支付页面的代码,让用户先完成支付流程:
if (newUser != null) { // 仅保留这一次跳转,引导用户进入支付页面 Navigator.of(context).pushReplacement(MaterialPageRoute( builder: (context) => const StripePaymentScreen())); }
2. 修改StripePaymentScreen的支付后导航逻辑
将支付成功后的Navigator.pop(context)改为跳转到邮箱验证页面,同时修复支付失败时弹窗未显示的问题:
// 修改displayPaymentSheet方法中的支付成功回调 await Stripe.instance.presentPaymentSheet().then((value) { showDialog( context: context, builder: (_) => const AlertDialog( content: Column( mainAxisSize: MainAxisSize.min, children: [ Icon( Icons.check_circle, color: Colors.green, size: 100.0, ), SizedBox(height: 10.0), Text("Payment Successful!"), ], ), )).then((_) { // 弹窗关闭后跳转到邮箱验证页面 Navigator.of(context).pushReplacement(MaterialPageRoute( builder: (context) => const VerifyEmailScreen())); }); paymentIntent = null; }).onError((error, stackTrace) { throw Exception(error); }); // 修复支付失败时的弹窗显示逻辑 } on StripeException catch (e) { showDialog( context: context, builder: (_) => const AlertDialog( content: Column( mainAxisSize: MainAxisSize.min, children: [ Row( children: [ Icon( Icons.cancel, color: Colors.red, ), Text("Payment Failed"), ], ), ], ), )); }
3. 额外优化建议
- 在
makePayment方法中,将displayPaymentSheet()改为await displayPaymentSheet(),确保支付流程完全结束后再执行后续操作; - 把注册页面中
setState(() { showSpinner = false; });移到try块的末尾,避免异常情况加载 spinner 一直显示。
内容的提问来源于stack exchange,提问作者LostTexan
相关产品推荐
相关产品推荐

