PubsubStream class
class PubsubStream { StreamController<PubsubMessage> _controller; Map<Function, StreamSubscription<PubsubMessage>> _listeners; Map<StreamSubscription<PubsubMessage>, Function> _subscriptions; PubsubMessage _lastMessage = null; PubsubStream() { _controller = new StreamController<PubsubMessage>.broadcast(); _listeners = new Map<Function, StreamSubscription<PubsubMessage>>(); _subscriptions = new Map<StreamSubscription<PubsubMessage>, Function>(); _controller.stream.listen(_selfListener); } void add(Function listener) { if(_listeners.containsKey(listener)) return; StreamSubscription<PubsubMessage> subscription = _controller.stream.listen(listener); _listeners[listener] = subscription; _subscriptions[subscription] = listener; if(_lastMessage != null) { listener(_lastMessage); } } void remove(Function listener) { if(_listeners.containsKey(listener)) { _subscriptions.remove(_listeners[listener]); //This is run async so any messages currently queues can finish runAsync(_listeners[listener].cancel); _listeners.remove(listener); } } void fire(PubsubMessage message) { _controller.add(message); _lastMessage = message; } get hasListeners => _controller.hasListener; void _selfListener(PubsubMessage msg) { //Do nothing, just here to make sure the steam is always empty } }
Constructors
new PubsubStream() #
Creates a new Object instance.
Object instances have no meaningful state, and are only useful through their identity. An Object instance is equal to itself only.
docs inherited from Object
PubsubStream() { _controller = new StreamController<PubsubMessage>.broadcast(); _listeners = new Map<Function, StreamSubscription<PubsubMessage>>(); _subscriptions = new Map<StreamSubscription<PubsubMessage>, Function>(); _controller.stream.listen(_selfListener); }
Properties
final hasListeners #
get hasListeners => _controller.hasListener;
Methods
void add(Function listener) #
void add(Function listener) { if(_listeners.containsKey(listener)) return; StreamSubscription<PubsubMessage> subscription = _controller.stream.listen(listener); _listeners[listener] = subscription; _subscriptions[subscription] = listener; if(_lastMessage != null) { listener(_lastMessage); } }
void fire(PubsubMessage message) #
void fire(PubsubMessage message) { _controller.add(message); _lastMessage = message; }