implement queue to events emitter
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
import 'dart:collection';
|
||||||
|
|
||||||
import 'package:meta/meta.dart';
|
import 'package:meta/meta.dart';
|
||||||
import 'package:synchronized/synchronized.dart' as sync;
|
import 'package:synchronized/synchronized.dart' as sync;
|
||||||
@@ -22,9 +23,13 @@ class EventsEmitter<T> extends EventsListenable<T> {
|
|||||||
// suppport for multiple event listeners
|
// suppport for multiple event listeners
|
||||||
final streamCtrl = StreamController<T>.broadcast(sync: false);
|
final streamCtrl = StreamController<T>.broadcast(sync: false);
|
||||||
|
|
||||||
|
bool _queueMode = false;
|
||||||
|
final _queue = Queue<T>();
|
||||||
|
|
||||||
EventsEmitter({
|
EventsEmitter({
|
||||||
bool listenSynchronized = false,
|
bool listenSynchronized = false,
|
||||||
}) : super(synchronized: listenSynchronized) {
|
}) : super(synchronized: listenSynchronized) {
|
||||||
|
// clean up
|
||||||
onDispose(() async => await streamCtrl.close());
|
onDispose(() async => await streamCtrl.close());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -33,14 +38,40 @@ class EventsEmitter<T> extends EventsListenable<T> {
|
|||||||
|
|
||||||
@internal
|
@internal
|
||||||
void emit(T event) {
|
void emit(T event) {
|
||||||
// do nothing if already closed
|
// check if already disposed
|
||||||
if (streamCtrl.isClosed) {
|
if (isDisposed) {
|
||||||
logger.warning('failed to emit event ${event} on a disposed emitter');
|
logger.warning('failed to emit event ${event} on a disposed emitter');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
// queue mode
|
||||||
|
if (_queueMode) {
|
||||||
|
_queue.add(event);
|
||||||
|
return;
|
||||||
|
}
|
||||||
// emit the event
|
// emit the event
|
||||||
streamCtrl.add(event);
|
streamCtrl.add(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@internal
|
||||||
|
void updateQueueMode(bool newValue, {bool shouldEmitQueued = true}) {
|
||||||
|
// check if already disposed
|
||||||
|
if (isDisposed) {
|
||||||
|
logger.warning('failed to update queueMode on a disposed emitter');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (_queueMode == newValue) return;
|
||||||
|
_queueMode = newValue;
|
||||||
|
if (!_queueMode && shouldEmitQueued) emitQueued();
|
||||||
|
}
|
||||||
|
|
||||||
|
@internal
|
||||||
|
void emitQueued() {
|
||||||
|
while (_queue.isNotEmpty) {
|
||||||
|
final event = _queue.removeFirst();
|
||||||
|
// emit the event
|
||||||
|
streamCtrl.add(event);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// for listening only
|
// for listening only
|
||||||
|
|||||||
Reference in New Issue
Block a user