#flutter #dart #in-app-purchase #bloc
Вопрос:
Я пытаюсь немного переработать свой код и хочу переработать логику платежей с помощью блока. Проблема в том, что я все еще получаю сообщение об ошибке, в котором говорится:
эмиссия была вызвана после того, как обработчик событий завершился нормально.
Мне нужна информация из состояния только в том случае, если транзакция находится в ожидании, завершена или произошла ошибка, поэтому для отображения индикатора циркуляции используется только значение true или false.
Есть моя попытка реализовать оплату с помощью блока.
_onStarted — запускает подписку и вызывается один раз в состоянии инициализации
_buyProduct — вызывается, когда пользователь нажимает кнопку
class PaymentBloc extends Bloclt;PaymentEvent, PaymentStategt; { static const bool _started = false; final InAppPurchase _inAppPurchase = InAppPurchase.instance; Setlt;Stringgt; _kProductIds = {"mini_burger_4_99"}; Listlt;ProductDetailsgt; _products = []; PaymentBloc() : super(PaymentInitial(_started)) { onlt;PaymentStartedgt;(_onStarted); onlt;PaymentCompletiongt;(_buyProduct); } StreamSubscriptionlt;Listlt;PurchaseDetailsgt;gt;? _subscription; void _onStarted(PaymentStarted event, Emitterlt;PaymentStategt; emit) { final Streamlt;Listlt;PurchaseDetailsgt;gt; purchaseUpdated = _inAppPurchase.purchaseStream; _subscription = purchaseUpdated.listen((purchaseDetailsList) { purchaseDetailsList.forEach((PurchaseDetails purchaseDetails) async { if (purchaseDetails.status == PurchaseStatus.pending) { emit(PaymentPending()); } else { if (purchaseDetails.status == PurchaseStatus.error) { emit(PaymentError()); } else if (purchaseDetails.pendingCompletePurchase) { await _inAppPurchase.completePurchase(purchaseDetails); emit(PaymentComplete()); } } }); }, onDone: () { _subscription?.cancel(); }, onError: (error) { // handle error. }); initStoreInfo(); } Futurelt;voidgt; _buyProduct( PaymentCompletion event, Emitterlt;PaymentStategt; emit) async { var paymentWrapper = SKPaymentQueueWrapper(); var transactions = await paymentWrapper.transactions(); transactions.forEach((transaction) async { await paymentWrapper.finishTransaction(transaction); }); final PurchaseParam purchaseParam = PurchaseParam( productDetails: _products.firstWhere((product) =gt; product.id == event.id)); await _inAppPurchase.buyConsumable(purchaseParam: purchaseParam); } @override Futurelt;voidgt; close() { _subscription?.cancel(); return super.close(); } Futurelt;voidgt; initStoreInfo() async { final bool isAvailable = await _inAppPurchase.isAvailable(); if (!isAvailable) { _products = []; return; } if (Platform.isIOS) { var iosPlatformAddition = _inAppPurchase .getPlatformAdditionlt;InAppPurchaseIosPlatformAdditiongt;(); await iosPlatformAddition.setDelegate(ExamplePaymentQueueDelegate()); } ProductDetailsResponse productDetailResponse = await _inAppPurchase.queryProductDetails(_kProductIds); if (productDetailResponse.error != null) { _products = productDetailResponse.productDetails; return; } if (productDetailResponse.productDetails.isEmpty) { _products = productDetailResponse.productDetails; return; } _products = productDetailResponse.productDetails; } }
Спасибо за любую помощь.
Мэтт