StackAsk is a community where developers ask questions, share answers and learn from each others real-world experience, so every solved problem helps the next person who runs into it.
import 'package:bloc/bloc.dart'; import 'package:bloc_concurrency/bloc_concurrency.dart'; class TestEvent {} class TestBloc extends Bloc { TestBloc() : super(Object()) { on(_onTestEvent, transformer: restartable()); } var testCounter = 0; Future _onTestEvent(event, emit) async { final counter = testCounter++; print('Starting test count: $counter, is emitter alive: '); await Future.delayed(const Duration(seconds: 5)); if (emit.isDone) return; // We should reach here only for latest event print('Finished test count: $counter, is emitter alive: '); } } void main() { final bloc = TestBloc(); bloc.stream.listen(null); bloc.add(TestEvent()); bloc.add(TestEvent()); bloc.add(TestEvent()); }
Starting test count: 0, is emitter alive: true Starting test count: 1, is emitter alive: true Starting test count: 2, is emitter alive: true Finished test count: 2, is emitter alive: true
environment: sdk: '>=2.18.2 <3.0.0' dev_dependencies: lints: ^2.0.0 test: ^1.16.0 bloc: ^8.1.0 bloc_concurrency: ^0.2.0
import 'package:bloc/bloc.dart'; import 'package:bloc_concurrency/bloc_concurrency.dart'; abstract class BaseEvent {} class PickImageEvent extends BaseEvent {} class IdentifyImageEvent extends BaseEvent {} class ShowResultEvent extends BaseEvent {} class BaseState {} class TestBloc extends Bloc { TestBloc() : super(BaseState()) { on(_onPickImageEvent, transformer: restartable()); on(_onIdentifyImageEvent, transformer: restartable()); on(_onShowResultEvent, transformer: restartable()); } var testCounter = 0; Future _onPickImageEvent( PickImageEvent event, Emitter emit, ) async { final counter = ++testCounter; print('Start picking image | Counter $counter'); await Future.delayed(const Duration(seconds: 5)); print('Have picked an image | Counter $counter'); add(IdentifyImageEvent()); } Future _onIdentifyImageEvent( IdentifyImageEvent event, Emitter emit, ) async { print('> Start identifying that image | Counter $testCounter'); await Future.delayed(const Duration(seconds: 3)); print('> Finished identifying that image | Counter $testCounter'); add(ShowResultEvent()); } Future _onShowResultEvent( ShowResultEvent event, Emitter emit, ) async { print('>> Start showing result | Counter $testCounter'); await Future.delayed(const Duration(seconds: 2)); print('>> Stopped showing result | Counter $testCounter'); } } /// Expect result: /// Start picking image | Counter 1 /// Start picking image | Counter 2 /// Start picking image | Counter 3 /// /// Have picked an image | Counter 3 /// /// > Start identifying that image | Counter 3 /// > Finished identifying that image | Counter 3 /// /// >> Start showing result | Counter 3 /// >> Stopped showing result | Counter 3 void main() { final bloc = TestBloc(); bloc.stream.listen(null); bloc.add(PickImageEvent()); bloc.add(PickImageEvent()); bloc.add(PickImageEvent()); }
<span>import</span> <span>'package</span>:bloc/bloc.dart'; <span>import</span> <span>'package</span>:bloc_concurrency/bloc_concurrency.dart'; <span>abstract</span> <span><span>class</span> <span>BaseEvent</span> </span>{} <span><span>class</span> <span>PickImageEvent</span> <span>extends</span> <span>BaseEvent</span> </span>{} <span><span>class</span> <span>IdentifyImageEvent</span> <span>extends</span> <span>BaseEvent</span> </span>{} <span><span>class</span> <span>ShowResultEvent</span> <span>extends</span> <span>BaseEvent</span> </span>{} <span><span>class</span> <span>BaseState</span> </span>{ } <span><span>class</span> <span>BlockProxy</span> <span>extends</span> <span>Bloc<BaseEvent</span>, <span>BaseState></span> </span>{ <span>var</span> _counter = <span>0</span>; <span>BlockProxy</span>(<span>var</span> testCounter) : <span>super</span>(<span>BaseState</span>()) { _counter = testCounter; on<<span>PickImageEvent</span>>(_onPickImageEvent, transformer: restartable()); on<<span>IdentifyImageEvent</span>>(_onIdentifyImageEvent, transformer: restartable()); on<<span>ShowResultEvent</span>>(_onShowResultEvent, transformer: restartable()); } <span>Future</span> _onPickImageEvent(event, emit) async { print(<span>'Start</span> picking image | <span>Counter</span> $_counter'); await <span>Future</span>.delayed(const <span>Duration</span>(seconds: <span>5</span>)); <span>if</span> (!isClosed) { print(<span>'Have</span> picked an image | <span>Counter</span> $_counter'); add(<span>IdentifyImageEvent</span>()); } } <span>Future</span> _onIdentifyImageEvent(event, emit) async { print('> <span>Start</span> identifying that image | <span>Counter</span> $_counter'); await <span>Future</span>.delayed(const <span>Duration</span>(seconds: <span>3</span>)); <span>if</span> (!isClosed) { print('> <span>Finished</span> identifying that image | <span>Counter</span> $_counter'); add(<span>ShowResultEvent</span>()); } } <span>Future</span> _onShowResultEvent(event, emit) async { print('>> <span>Start</span> showing result | <span>Counter</span> $_counter'); await <span>Future</span>.delayed(const <span>Duration</span>(seconds: <span>2</span>)); <span>if</span> (!isClosed) { print('>> <span>Stopped</span> showing result | <span>Counter</span> $_counter'); } } } <span><span>class</span> <span>TestBloc</span> </span>{ <span>List</span><<span>BlockProxy</span>> blocList = []; <span>var</span> testCounter = <span>0</span>; void add(<span>PickImageEvent</span> event) async { <span>for</span> (<span>BlockProxy</span> element in blocList) { <span>if</span> (!element.isClosed) { element.close(); } } <span>var</span> bloc = <span>BlockProxy</span>(++testCounter); blocList.add(bloc); bloc.stream.listen(<span>null</span>); bloc.add(event); } } <span>/// Expect result:</span> <span>/// Start picking image | Counter 1</span> <span>/// Start picking image | Counter 2</span> <span>/// Start picking image | Counter 3</span> <span>///</span> <span>/// Have picked an image | Counter 3</span> <span>///</span> <span>/// > Start identifying that image | Counter 3</span> <span>/// > Finished identifying that image | Counter 3</span> <span>///</span> <span>/// >> Start showing result | Counter 3</span> <span>/// >> Stopped showing result | Counter 3</span> void main() { <span>final</span> bloc = <span>TestBloc</span>(); bloc.add(<span>PickImageEvent</span>()); bloc.add(<span>PickImageEvent</span>()); bloc.add(<span>PickImageEvent</span>()); }
2.2K Point(s)
1.2K Point(s)
313 Point(s)
178 Point(s)
138 Point(s)
Your account is signed in on the device(s) below. Sign out of at least one of them to continue signing in on this device.
Your account is signed in on the device(s) below. Sign out directly on one of those devices, or wait until the sign-in again time shown below.
If you cant access those devices, please contact the administrator to sign them out for you.
Input your email to receive reset password link, or if you remember your password, you can click