Как использовать in_app_purchase с помощью блока?

#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;  } }  

Спасибо за любую помощь.

Мэтт