-
Notifications
You must be signed in to change notification settings - Fork 276
add ValueStream.isReplayValueStream
#784
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from all commits
d648dd3
dbd79d1
6e743ef
a1e7b9b
4e4f53d
edcdf53
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -51,7 +51,7 @@ class ValueStreamListener<T> extends StatefulWidget { | |
required this.stream, | ||
required this.listener, | ||
required this.child, | ||
this.isReplayValueStream = true, | ||
this.isReplayValueStream, | ||
}) : super(key: key); | ||
|
||
/// The [ValueStream] that the [ValueStreamConsumer] will interact with. | ||
|
@@ -67,9 +67,12 @@ class ValueStreamListener<T> extends StatefulWidget { | |
|
||
/// Whether or not the [stream] emits the last value | ||
/// like [BehaviorSubject] does. | ||
/// See [ValueStream.isReplayValueStream] for more information. | ||
/// | ||
/// Defaults to `true`. | ||
final bool isReplayValueStream; | ||
/// If this argument is `null`, the [ValueStream.isReplayValueStream] is used instead. | ||
/// | ||
/// Defaults to `null`. | ||
final bool? isReplayValueStream; | ||
|
||
@override | ||
State<ValueStreamListener<T>> createState() => _ValueStreamListenerState<T>(); | ||
|
@@ -79,8 +82,8 @@ class ValueStreamListener<T> extends StatefulWidget { | |
super.debugFillProperties(properties); | ||
properties | ||
..add(DiagnosticsProperty<ValueStream<T>>('stream', stream)) | ||
..add( | ||
DiagnosticsProperty<bool>('isReplayValueStream', isReplayValueStream)) | ||
..add(DiagnosticsProperty<bool>('isReplayValueStream', | ||
isReplayValueStream ?? stream.isReplayValueStream)) | ||
..add(ObjectFlagProperty<ValueStreamWidgetListener<T>>.has( | ||
'listener', listener)) | ||
..add(ObjectFlagProperty<Widget>.has('child', child)); | ||
|
@@ -127,21 +130,28 @@ class _ValueStreamListenerState<T> extends State<ValueStreamListener<T>> { | |
_currentValue = stream.value; | ||
} | ||
|
||
final int skipCount; | ||
|
||
if (widget.isReplayValueStream) { | ||
skipCount = _initialized ? 0 : 1; | ||
if (widget.isReplayValueStream ?? stream.isReplayValueStream) { | ||
final skipCount = _initialized ? 0 : 1; | ||
_subscribeIfNeeded(skipCount > 0 ? stream.skip(skipCount) : stream); | ||
} else { | ||
skipCount = 0; | ||
if (_initialized) { | ||
_ambiguate(WidgetsBinding.instance)!.addPostFrameCallback((_) { | ||
if (widget.stream != stream) { | ||
return; | ||
} | ||
_notifyListener(stream.value); | ||
_subscribeIfNeeded(stream); | ||
}); | ||
} else { | ||
_subscribeIfNeeded(stream); | ||
} | ||
} | ||
} | ||
|
||
final streamToListen = skipCount > 0 ? stream.skip(skipCount) : stream; | ||
|
||
void _subscribeIfNeeded(Stream<T> streamToListen) { | ||
if (_subscription != null) { | ||
return; | ||
} | ||
Comment on lines
+151
to
+154
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The method name Copilot uses AI. Check for mistakes. Positive FeedbackNegative Feedback |
||
_subscription = streamToListen.listen( | ||
(value) { | ||
if (!mounted) return; | ||
|
@@ -164,6 +174,7 @@ class _ValueStreamListenerState<T> extends State<ValueStreamListener<T>> { | |
|
||
void _unsubscribe() { | ||
_subscription?.cancel(); | ||
_subscription = null; | ||
} | ||
|
||
@override | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This condition uses
widget.stream
instead of_currentStream
which could cause incorrect behavior. The condition should check if the current stream has changed since the callback was scheduled.Copilot uses AI. Check for mistakes.