From ad8b051a38ebe9e6e12b8046df7b2c225dd56228 Mon Sep 17 00:00:00 2001 From: Koen Van Looveren Date: Sun, 22 Dec 2024 10:19:55 +0100 Subject: [PATCH] fix: Made the MultiListenerStreamController more versatile by adding a streamOrNull, value, valueOrNull and hasValue property --- CHANGELOG.md | 6 +++ .../multi_listener_stream_controller.dart | 53 +++++++++---------- 2 files changed, 31 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dc2a920..01b1e3b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +# 0.5.1 + +## Fix + +- Made the MultiListenerStreamController more versatile by adding a streamOrNull, value, valueOrNull and hasValue property + # 0.5.0 ## Feat diff --git a/lib/src/util/stream/multi_listener_stream_controller.dart b/lib/src/util/stream/multi_listener_stream_controller.dart index 331ba7a..c128c33 100644 --- a/lib/src/util/stream/multi_listener_stream_controller.dart +++ b/lib/src/util/stream/multi_listener_stream_controller.dart @@ -1,50 +1,47 @@ import 'dart:async'; -/// A simplified BehaviorSubject implementation -class MultiListenerStreamController { - late T _value; - bool _hasValue = false; +class MultiListenerStreamController { + T? _value; final _controller = StreamController.broadcast(); MultiListenerStreamController([T? initialValue]) { - if (initialValue != null) { - _value = initialValue; - _hasValue = true; - } + _value = initialValue; } - /// Get the current value T get value { - if (!_hasValue) { - throw StateError('No value has been emitted yet.'); + if (hasValue) { + return _value as T; } - return _value; + throw StateError('No value has been emitted yet.'); } - /// Emit a new value + T? get valueOrNull => _value; + + bool get hasValue => _value != null; + void add(T newValue) { _value = newValue; - _hasValue = true; _controller.add(newValue); } - /// Listen to the stream - Stream get stream { - return _controller.stream.transform( - StreamTransformer.fromHandlers( - handleData: (data, sink) { - if (_hasValue) { - sink.add(_value); // Emit the current value to new listeners - } - }, - ), - ); - } + Stream get stream => _controller.stream.transform( + StreamTransformer.fromHandlers( + handleData: (data, sink) { + if (hasValue) { + sink.add(_value as T); + } + }, + ), + ); + + Stream get streamOrNull => _controller.stream.transform( + StreamTransformer.fromHandlers( + handleData: (data, sink) => sink.add(_value), + ), + ); - /// Close the stream Future close() => _controller.close(); - /// Check if the stream is closed bool get isClosed => _controller.isClosed; }