Bloc Concurrency with restartable transformer does not cancel previous event
This issue was already solved on Github. The reason the bloc cannot be cancelled was because Future in Dart are truly not cancelable, as explaned here. Also the developer has provide the solution for this approach
Philip Purwoko
Hello, I am self taught Software Developer using Nodejs, Python, and Flutter. I love to be innovative
Updated on December 18, 2022Comments
-
Philip Purwoko over 1 year
Description
Bloc Concurrency with restartable transformer does not cancel previous event
Steps To Reproduce
The bloc file
merchant_product_bloc.dart
that listen on an eventMerchantProductCartChanged
and emit the stateMerchantProductCartChange
class MerchantProductBloc extends Bloc<MerchantProductEvent, MerchantProductState> { MerchantProductBloc() : super(MerchantProductInitial()) { on<MerchantProductCartChanged>(_changeCart, transformer: restartable()); } Future<void> _changeCart( MerchantProductCartChanged event, Emitter<MerchantProductState> emit, ) async { await Future.delayed(const Duration(milliseconds: 300)); logInfo('Cart Changed | productId=${event.productId} qty=${event.qty}'); emit(const MerchantProductCartChange.loading()); try { await productRepository.changeCart( productId: event.productId, qty: event.qty, date: event.date, ); emit(const MerchantProductCartChange.success()); } catch (e) { emit(MerchantProductCartChange.error(msg: e.toString(), lastData: event)); } } }
The button I used to trigger the event
MerchantProductCartChanged
BlocProvider.of<MerchantProductBloc>(context).add( MerchantProductCartChanged( productId: product.id!, initialQty: 1, ), );
When I pressed the button 4 times very fast. It logs 4 times as well and call API 4 times
I/PLogger (30516): {PAX A920} {Loket} {Cart Changed | productId=104 qty=13} {06 May 2022 08:35:58 PM} {INFO} I/PLogger (30516): {PAX A920} {Loket} {Cart Changed | productId=104 qty=14} {06 May 2022 08:35:58 PM} {INFO} I/PLogger (30516): {PAX A920} {Loket} {Cart Changed | productId=104 qty=15} {06 May 2022 08:35:58 PM} {INFO} I/PLogger (30516): {PAX A920} {Loket} {Cart Changed | productId=104 qty=16} {06 May 2022 08:35:58 PM} {INFO}
Expected Behavior
Should only logs one line at last event
I/PLogger (30516): {PAX A920} {Loket} {Cart Changed | productId=104 qty=16} {06 May 2022 08:35:58 PM} {INFO}