From e0766888544dd4a07607e83bda49e70748c1950b Mon Sep 17 00:00:00 2001 From: wuqifeng <540416539@qq.com> Date: Sat, 27 Apr 2024 12:21:34 +0800 Subject: [PATCH] feat:解决微信支付异步回调里emitter(PaySuccessState())报错问题 --- lib/common/request/dao/shop_dao.dart | 12 ++++++------ lib/pages/shopping/bloc.dart | 36 +++++++++++++++++++----------------- lib/pages/shopping/event.dart | 6 +++++- 3 files changed, 30 insertions(+), 24 deletions(-) diff --git a/lib/common/request/dao/shop_dao.dart b/lib/common/request/dao/shop_dao.dart index ef8cd26..5558f69 100644 --- a/lib/common/request/dao/shop_dao.dart +++ b/lib/common/request/dao/shop_dao.dart @@ -8,20 +8,20 @@ class ShopDao { } ///创建订单 - static Future createOrder(ProductEntity productEntity) async { + static Future?> createOrder(ProductEntity productEntity) async { return await requestClient - .post>(Apis.createOrder, data: {'courseComboId': productEntity.id}); + .post?>(Apis.createOrder, data: {'courseComboId': productEntity.id}); } ///获取alipay支付订单信息 - static Future getAliPayToken(String orderNo) async { + static Future?> getAliPayToken(String orderNo) async { return await requestClient - .post>(Apis.getAliPayToken, data: {'orderNo': orderNo}); + .post?>(Apis.getAliPayToken, data: {'orderNo': orderNo}); } ///获取weixin支付订单信息 - static Future getWxPayToken(String orderNo) async { + static Future?> getWxPayToken(String orderNo) async { return await requestClient - .post>(Apis.getWxPayToken, data: {'orderNo': orderNo}); + .post?>(Apis.getWxPayToken, data: {'orderNo': orderNo}); } } diff --git a/lib/pages/shopping/bloc.dart b/lib/pages/shopping/bloc.dart index be856c5..abd04e1 100644 --- a/lib/pages/shopping/bloc.dart +++ b/lib/pages/shopping/bloc.dart @@ -36,6 +36,9 @@ class ShoppingBloc extends Bloc { on(_init); on(_changePaymentChannel); on(_startPay); + on((event, emit) { + emit(PaySuccessState()); + }); } void _init(InitEvent event, Emitter emit) async { @@ -55,7 +58,6 @@ class ShoppingBloc extends Bloc { void _startPay(DoPayEvent event, Emitter emitter) async { - Log.d("开始支付 ${event.productEntity} ${event.paymentChannel}"); //如果event.productEntity为空,中断流程并toast提示 if (event.productEntity == null) { showToast("商品信息为空"); @@ -64,29 +66,31 @@ class ShoppingBloc extends Bloc { final productEntitySafely = event.productEntity!; try { await loading(() async { - final Map orderInfo = await ShopDao.createOrder(productEntitySafely); - Log.d("orderInfo $orderInfo"); - final String? orderNo = orderInfo.getOrNull("orderNo"); + final Map? orderInfo = await ShopDao.createOrder(productEntitySafely); + final String? orderNo = orderInfo?.getOrNull("orderNo"); if (orderNo == null) { showToast("订单创建失败"); return; } - Log.d("orderNo $orderNo"); if (event.paymentChannel == PaymentChannel.wechatPay) { if (_isWxPayListenerInitialized == false) { _isWxPayListenerInitialized = true; fluwx = Fluwx(); - fluwx?.registerApi(appId: "wx365e5a79956a450a", + await fluwx?.registerApi(appId: "wx365e5a79956a450a", universalLink: "https://app-api.wowenglish.com.cn/app/"); wxPayResponseListener = (WeChatResponse response) { - Log.d("wxPayResponseListener $response"); + debugPrint("WqfPay wxPayResponseListener $response"); if (response is WeChatPaymentResponse) { if (response.errCode == 0) { - Log.d("wxPayResponseListener response=${response.errCode}"); + debugPrint("WqfPay wxPayResponseListener response=${response.errCode}"); showToast("支付成功"); // Log.d("emitter isDone=${emitter.isDone}"); + + /// 报错!_isCompleted emit was called after an event handler completed normally // emitter(PaySuccessState()); + + add(WxPaySuccessEvent()); } else { showToast("支付失败"); } @@ -103,10 +107,8 @@ class ShoppingBloc extends Bloc { return; } - final Map wxPayOrderInfo = await ShopDao.getWxPayToken(orderNo); - Log.d("wxPayOrderInfo=$wxPayOrderInfo type=${wxPayOrderInfo.runtimeType}"); - final String? wxPayInfo = wxPayOrderInfo.getOrNull("appId"); - if (wxPayInfo == null) { + final Map? wxPayOrderInfo = await ShopDao.getWxPayToken(orderNo); + if (wxPayOrderInfo == null) { showToast("微信订单创建失败"); return; } @@ -122,18 +124,18 @@ class ShoppingBloc extends Bloc { sign: wxPayOrderInfo['sign'].toString(), )); } else { - final Map aliPayOrderInfo = await ShopDao.getAliPayToken(orderNo); - Log.d("aliPayOrderInfo=$aliPayOrderInfo type=${aliPayOrderInfo.runtimeType}"); - final String? aliPayInfo = aliPayOrderInfo.getOrNull("token"); + final Map? aliPayOrderInfo = await ShopDao.getAliPayToken(orderNo); + debugPrint("aliPayOrderInfo=$aliPayOrderInfo type=${aliPayOrderInfo?.runtimeType}"); + final String? aliPayInfo = aliPayOrderInfo?.getOrNull("token"); if (aliPayInfo == null) { showToast("支付宝订单创建失败"); return; } - Log.d("aliPayInfo=$aliPayInfo"); + debugPrint("aliPayInfo=$aliPayInfo"); ///打印aliPayOrderInfo的type Tobias tobias = Tobias(); final Map aliPayResult = await tobias.pay(aliPayInfo); - Log.d("aliPayResult=$aliPayResult"); + debugPrint("aliPayResult=$aliPayResult"); // 判断resultStatus 为9000则代表支付成功 if (aliPayResult.getOrNull("resultStatus") == "9000") { showToast("支付成功"); diff --git a/lib/pages/shopping/event.dart b/lib/pages/shopping/event.dart index 62b0db0..97acd56 100644 --- a/lib/pages/shopping/event.dart +++ b/lib/pages/shopping/event.dart @@ -19,4 +19,8 @@ class DoPayEvent extends ShoppingEvent { final PaymentChannel paymentChannel; DoPayEvent(this.productEntity, this.paymentChannel); -} \ No newline at end of file +} + +// 微信由于是异步回调方式通知支付状态,在异步回调里emitter(PaySuccessState())时报错 +// !_isCompleted emit was called after an event handler completed normally +class WxPaySuccessEvent extends ShoppingEvent {} \ No newline at end of file -- libgit2 0.22.2