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

Getx调用后端接口后展示BottomSheet异常求助

问题分析与解决方案

你的问题核心在于increaseWallet方法里的await并没有真正等待支付回调完成。MangoPay.instance.makePayment虽然用了await,但它的异步结果是通过paymentCallback回调通知的,而非返回一个可被await等待的Future,导致方法会直接执行到return bContinue,此时回调还未触发,_bContinue仍是初始值,最终BottomSheet提前弹出。

修改控制器方法

用Completer将回调逻辑包装为Future,确保方法在支付结果返回后再返回值:

Future<bool> increaseWallet() async {
  final completer = Completer<bool>();
  try {
    await MangoPay.instance.makePayment(
      mangoPayUserId: user!.mangoPayId!,
      mangoPayPaymentWalletId: user!.walletId!,
      cardData: _cardData,
      amount: double.parse(amount),
      paymentCallback: (result, message, transactionId, status) {
        hideLoader();
        if (status == "SUCCEEDED") {
          completer.complete(true);
        } else {
          // 支付失败时返回false
          completer.complete(false);
        }
      },
    );
  } catch (e) {
    hideLoader();
    completer.complete(false);
  }
  return completer.future;
}

页面调用优化

可以用async/await让逻辑更清晰,同时增加判断确保仅支付成功时弹出BottomSheet:

SizedBox(
  width: double.infinity,
  child: PrimaryButtonBG(
    text: 'Ricarica wallet',
    onTap: () async {
      bool isSuccess = await controller.increaseWallet();
      if (isSuccess) {
        openSuccessWallet(context);
      }
    },
  ),
),

额外注意事项

  • 移除原代码中的_bContinue成员变量,直接通过Completer返回结果,避免状态混乱。
  • 统一hideLoader的调用时机,原代码中多处重复调用,现在集中在回调和异常捕获中处理即可。

内容的提问来源于stack exchange,提问作者macuser

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 11:45:26