You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 17:54:50