Skip to content

Commit

Permalink
Allow Listenable.merge() to use any iterable (#143675)
Browse files Browse the repository at this point in the history
This is a very small change that fixes #143664.
  • Loading branch information
nate-thegrate authored Feb 26, 2024
1 parent c82ca46 commit 7b5ec58
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 5 deletions.
10 changes: 5 additions & 5 deletions packages/flutter/lib/src/foundation/change_notifier.dart
Original file line number Diff line number Diff line change
Expand Up @@ -62,11 +62,11 @@ abstract class Listenable {
/// Return a [Listenable] that triggers when any of the given [Listenable]s
/// themselves trigger.
///
/// The list must not be changed after this method has been called. Doing so
/// will lead to memory leaks or exceptions.
/// Once the factory is called, items must not be added or removed from the iterable.
/// Doing so will lead to memory leaks or exceptions.
///
/// The list may contain nulls; they are ignored.
factory Listenable.merge(List<Listenable?> listenables) = _MergingListenable;
/// The iterable may contain nulls; they are ignored.
factory Listenable.merge(Iterable<Listenable?> listenables) = _MergingListenable;

/// Register a closure to be called when the object notifies its listeners.
void addListener(VoidCallback listener);
Expand Down Expand Up @@ -491,7 +491,7 @@ mixin class ChangeNotifier implements Listenable {
class _MergingListenable extends Listenable {
_MergingListenable(this._children);

final List<Listenable?> _children;
final Iterable<Listenable?> _children;

@override
void addListener(VoidCallback listener) {
Expand Down
15 changes: 15 additions & 0 deletions packages/flutter/test/foundation/change_notifier_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,21 @@ void main() {
log.clear();
});

test('Merging change notifiers supports any iterable', () {
final TestNotifier source1 = TestNotifier();
final TestNotifier source2 = TestNotifier();
final List<String> log = <String>[];

final Listenable merged = Listenable.merge(<Listenable?>{source1, source2});
void listener() => log.add('listener');

merged.addListener(listener);
source1.notify();
source2.notify();
expect(log, <String>['listener', 'listener']);
log.clear();
});

test('Merging change notifiers ignores null', () {
final TestNotifier source1 = TestNotifier();
final TestNotifier source2 = TestNotifier();
Expand Down

0 comments on commit 7b5ec58

Please sign in to comment.