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
相关产品推荐
相关产品推荐

