Skip to content

Commit db76a7c

Browse files
authored
Update listenable (#4062)
1 parent 0c02245 commit db76a7c

File tree

11 files changed

+71
-124
lines changed

11 files changed

+71
-124
lines changed

packages/flutter_riverpod/lib/src/providers/legacy/change_notifier_provider.dart

+5-9
Original file line numberDiff line numberDiff line change
@@ -294,15 +294,11 @@ class ChangeNotifierProviderElement<NotifierT extends ChangeNotifier?>
294294
}
295295

296296
@override
297-
void visitChildren({
298-
required void Function(ProviderElementBase<Object?> element) elementVisitor,
299-
required void Function($ElementLense<Object?> element) notifierVisitor,
300-
}) {
301-
super.visitChildren(
302-
elementVisitor: elementVisitor,
303-
notifierVisitor: notifierVisitor,
304-
);
305-
notifierVisitor(_notifierNotifier);
297+
void visitListenables(
298+
void Function($ElementLense<Object?> element) listenableVisitor,
299+
) {
300+
super.visitListenables(listenableVisitor);
301+
listenableVisitor(_notifierNotifier);
306302
}
307303
}
308304

packages/riverpod/lib/src/core/element.dart

+11-10
Original file line numberDiff line numberDiff line change
@@ -331,10 +331,8 @@ abstract class ProviderElementBase<StateT> implements Ref<StateT>, Node {
331331
// do not want to set the _dependencyMayHaveChanged flag to true.
332332
// Since the dependency is known to have changed, there is no reason to try
333333
// and "flush" it, as it will already get rebuilt.
334-
visitChildren(
335-
elementVisitor: (element) => element._markDependencyMayHaveChanged(),
336-
notifierVisitor: (notifier) => notifier.notifyDependencyMayHaveChanged(),
337-
);
334+
visitChildren((element) => element._markDependencyMayHaveChanged());
335+
visitListenables((notifier) => notifier.notifyDependencyMayHaveChanged());
338336
}
339337

340338
/// A utility for re-initializing a provider when needed.
@@ -634,9 +632,9 @@ The provider ${_debugCurrentlyBuildingElement!.origin} modified $origin while bu
634632
_dependencyMayHaveChanged = true;
635633

636634
visitChildren(
637-
elementVisitor: (element) => element._markDependencyMayHaveChanged(),
638-
notifierVisitor: (notifier) => notifier.notifyDependencyMayHaveChanged(),
635+
(element) => element._markDependencyMayHaveChanged(),
639636
);
637+
visitListenables((notifier) => notifier.notifyDependencyMayHaveChanged());
640638
}
641639

642640
bool _debugAssertCanDependOn(Object? listenable) {
@@ -832,10 +830,9 @@ The provider ${_debugCurrentlyBuildingElement!.origin} modified $origin while bu
832830
/// This method does not guarantee that a dependency is visited only once.
833831
/// If a provider both [watch] and [listen] an element, or if a provider
834832
/// [listen] multiple times to an element, it may be visited multiple times.
835-
void visitChildren({
836-
required void Function(ProviderElementBase element) elementVisitor,
837-
required void Function($ElementLense element) notifierVisitor,
838-
}) {
833+
void visitChildren(
834+
void Function(ProviderElementBase element) elementVisitor,
835+
) {
839836
for (var i = 0; i < _providerDependents.length; i++) {
840837
elementVisitor(_providerDependents[i]);
841838
}
@@ -849,6 +846,10 @@ The provider ${_debugCurrentlyBuildingElement!.origin} modified $origin while bu
849846
}
850847
}
851848

849+
void visitListenables(
850+
void Function($ElementLense element) listenableVisitor,
851+
) {}
852+
852853
/// Visit the [ProviderElementBase]s that this provider is listening to.
853854
///
854855
/// A provider is considered as listening to this element if it either [watch]

packages/riverpod/lib/src/core/provider_container.dart

+12-16
Original file line numberDiff line numberDiff line change
@@ -753,23 +753,19 @@ class ProviderContainer implements Node {
753753
// were already visited before.
754754
// If a child does not have all of its ancestors visited, when those
755755
// ancestors will be visited, they will retry visiting this child.
756-
element.visitChildren(
757-
elementVisitor: (dependent) {
758-
if (dependent.container == this) {
759-
// All the parents of a node must have been visited before a node is visited
760-
var areAllAncestorsAlreadyVisited = true;
761-
dependent.visitAncestors((e) {
762-
if (e._container == this && !visitedNodes.contains(e)) {
763-
areAllAncestorsAlreadyVisited = false;
764-
}
765-
});
756+
element.visitChildren((dependent) {
757+
if (dependent.container == this) {
758+
// All the parents of a node must have been visited before a node is visited
759+
var areAllAncestorsAlreadyVisited = true;
760+
dependent.visitAncestors((e) {
761+
if (e._container == this && !visitedNodes.contains(e)) {
762+
areAllAncestorsAlreadyVisited = false;
763+
}
764+
});
766765

767-
if (areAllAncestorsAlreadyVisited) queue.add(dependent);
768-
}
769-
},
770-
// We only care about Elements here, so let's ignore notifiers
771-
notifierVisitor: (_) {},
772-
);
766+
if (areAllAncestorsAlreadyVisited) queue.add(dependent);
767+
}
768+
});
773769
}
774770
}
775771
}

packages/riverpod/lib/src/experiments/mutations.dart

+4-8
Original file line numberDiff line numberDiff line change
@@ -70,14 +70,10 @@ mixin _MutationElement<T> on ProviderElementBase<T> {
7070
final mutations = <Mutation<Object?>, _MutationState<Object?>>{};
7171

7272
@override
73-
void visitChildren({
74-
required void Function(ProviderElementBase element) elementVisitor,
75-
required void Function($ElementLense element) notifierVisitor,
76-
}) {
77-
super.visitChildren(
78-
elementVisitor: elementVisitor,
79-
notifierVisitor: notifierVisitor,
80-
);
73+
void visitListenables(
74+
void Function($ElementLense element) notifierVisitor,
75+
) {
76+
super.visitListenables(notifierVisitor);
8177
for (final mutation in mutations.values) {
8278
notifierVisitor(mutation.listenable);
8379
}

packages/riverpod/lib/src/providers/async_notifier/orphan.dart

+10-18
Original file line numberDiff line numberDiff line change
@@ -472,15 +472,11 @@ mixin FutureHandlerProviderElementMixin<T>
472472
}
473473

474474
@override
475-
void visitChildren({
476-
required void Function(ProviderElementBase element) elementVisitor,
477-
required void Function($ElementLense element) notifierVisitor,
478-
}) {
479-
super.visitChildren(
480-
elementVisitor: elementVisitor,
481-
notifierVisitor: notifierVisitor,
482-
);
483-
notifierVisitor(futureNotifier);
475+
void visitListenables(
476+
void Function($ElementLense element) listenableVisitor,
477+
) {
478+
super.visitListenables(listenableVisitor);
479+
listenableVisitor(futureNotifier);
484480
}
485481
}
486482

@@ -497,15 +493,11 @@ abstract class AsyncNotifierProviderElementBase<
497493
final _notifierNotifier = $ElementLense<NotifierT>();
498494

499495
@override
500-
void visitChildren({
501-
required void Function(ProviderElementBase element) elementVisitor,
502-
required void Function($ElementLense element) notifierVisitor,
503-
}) {
504-
super.visitChildren(
505-
elementVisitor: elementVisitor,
506-
notifierVisitor: notifierVisitor,
507-
);
508-
notifierVisitor(_notifierNotifier);
496+
void visitListenables(
497+
void Function($ElementLense element) listenableVisitor,
498+
) {
499+
super.visitListenables(listenableVisitor);
500+
listenableVisitor(_notifierNotifier);
509501
}
510502

511503
@override

packages/riverpod/lib/src/providers/legacy/state_notifier_provider.dart

+5-9
Original file line numberDiff line numberDiff line change
@@ -250,15 +250,11 @@ class StateNotifierProviderElement<NotifierT extends StateNotifier<T>, T>
250250
}
251251

252252
@override
253-
void visitChildren({
254-
required void Function(ProviderElementBase element) elementVisitor,
255-
required void Function($ElementLense element) notifierVisitor,
256-
}) {
257-
super.visitChildren(
258-
elementVisitor: elementVisitor,
259-
notifierVisitor: notifierVisitor,
260-
);
261-
notifierVisitor(_notifierNotifier);
253+
void visitListenables(
254+
void Function($ElementLense element) listenableVisitor,
255+
) {
256+
super.visitListenables(listenableVisitor);
257+
listenableVisitor(_notifierNotifier);
262258
}
263259
}
264260

packages/riverpod/lib/src/providers/legacy/state_provider.dart

+6-10
Original file line numberDiff line numberDiff line change
@@ -211,16 +211,12 @@ class StateProviderElement<T> extends ProviderElementBase<T>
211211
}
212212

213213
@override
214-
void visitChildren({
215-
required void Function(ProviderElementBase element) elementVisitor,
216-
required void Function($ElementLense element) notifierVisitor,
217-
}) {
218-
super.visitChildren(
219-
elementVisitor: elementVisitor,
220-
notifierVisitor: notifierVisitor,
221-
);
222-
notifierVisitor(_stateNotifier);
223-
notifierVisitor(_controllerNotifier);
214+
void visitListenables(
215+
void Function($ElementLense element) listenableVisitor,
216+
) {
217+
super.visitListenables(listenableVisitor);
218+
listenableVisitor(_stateNotifier);
219+
listenableVisitor(_controllerNotifier);
224220
}
225221
}
226222

packages/riverpod/lib/src/providers/notifier/orphan.dart

+5-9
Original file line numberDiff line numberDiff line change
@@ -215,15 +215,11 @@ class NotifierProviderElement<NotifierT extends NotifierBase<T>, T>
215215
}
216216

217217
@override
218-
void visitChildren({
219-
required void Function(ProviderElementBase element) elementVisitor,
220-
required void Function($ElementLense element) notifierVisitor,
221-
}) {
222-
super.visitChildren(
223-
elementVisitor: elementVisitor,
224-
notifierVisitor: notifierVisitor,
225-
);
226-
notifierVisitor(_notifierNotifier);
218+
void visitListenables(
219+
void Function($ElementLense element) listenableVisitor,
220+
) {
221+
super.visitListenables(listenableVisitor);
222+
listenableVisitor(_notifierNotifier);
227223
}
228224

229225
@override

packages/riverpod/lib/src/providers/stream_provider.dart

+5-9
Original file line numberDiff line numberDiff line change
@@ -240,15 +240,11 @@ class StreamProviderElement<T> extends ProviderElementBase<AsyncValue<T>>
240240
}
241241

242242
@override
243-
void visitChildren({
244-
required void Function(ProviderElementBase element) elementVisitor,
245-
required void Function($ElementLense element) notifierVisitor,
246-
}) {
247-
super.visitChildren(
248-
elementVisitor: elementVisitor,
249-
notifierVisitor: notifierVisitor,
250-
);
251-
notifierVisitor(_streamNotifier);
243+
void visitListenables(
244+
void Function($ElementLense element) listenableVisitor,
245+
) {
246+
super.visitListenables(listenableVisitor);
247+
listenableVisitor(_streamNotifier);
252248
}
253249

254250
@override

packages/riverpod/test/old/framework/provider_element_test.dart

+2-6
Original file line numberDiff line numberDiff line change
@@ -1222,9 +1222,7 @@ void main() {
12221222

12231223
final children = <ProviderElementBase<Object?>>[];
12241224

1225-
container
1226-
.readProviderElement(provider)
1227-
.visitChildren(elementVisitor: children.add, notifierVisitor: (_) {});
1225+
container.readProviderElement(provider).visitChildren(children.add);
12281226
expect(
12291227
children,
12301228
unorderedMatches(<Object>[
@@ -1251,9 +1249,7 @@ void main() {
12511249

12521250
final children = <ProviderElementBase<Object?>>[];
12531251

1254-
container
1255-
.readProviderElement(provider)
1256-
.visitChildren(elementVisitor: children.add, notifierVisitor: (_) {});
1252+
container.readProviderElement(provider).visitChildren(children.add);
12571253
expect(
12581254
children,
12591255
unorderedMatches(<Object>[

packages/riverpod/test/old/legacy/framework2/framework_test.dart

+6-20
Original file line numberDiff line numberDiff line change
@@ -257,13 +257,11 @@ void main() {
257257
expect(sub.read(), '0');
258258
var firstDependents = <ProviderElementBase<Object?>>[];
259259
firstElement.visitChildren(
260-
elementVisitor: firstDependents.add,
261-
notifierVisitor: (_) {},
260+
firstDependents.add,
262261
);
263262
var secondDependents = <ProviderElementBase<Object?>>[];
264263
secondElement.visitChildren(
265-
elementVisitor: secondDependents.add,
266-
notifierVisitor: (_) {},
264+
secondDependents.add,
267265
);
268266

269267
expect(firstDependents, [computedElement]);
@@ -275,15 +273,9 @@ void main() {
275273
expect(sub.read(), 'fallback');
276274

277275
firstDependents = <ProviderElementBase<Object?>>[];
278-
firstElement.visitChildren(
279-
elementVisitor: firstDependents.add,
280-
notifierVisitor: (_) {},
281-
);
276+
firstElement.visitChildren(firstDependents.add);
282277
secondDependents = <ProviderElementBase<Object?>>[];
283-
secondElement.visitChildren(
284-
elementVisitor: secondDependents.add,
285-
notifierVisitor: (_) {},
286-
);
278+
secondElement.visitChildren(secondDependents.add);
287279
expect(firstDependents, [computedElement]);
288280
expect(firstElement.hasListeners, true);
289281
expect(secondDependents, <ProviderElement<Object?>>[]);
@@ -321,21 +313,15 @@ void main() {
321313

322314
expect(sub.read(), 0);
323315
var firstDependents = <ProviderElementBase<Object?>>[];
324-
firstElement.visitChildren(
325-
elementVisitor: firstDependents.add,
326-
notifierVisitor: (_) {},
327-
);
316+
firstElement.visitChildren(firstDependents.add);
328317
expect(firstDependents, {computedElement});
329318
expect(firstElement.hasListeners, true);
330319

331320
sub.close();
332321
await container.pump();
333322

334323
firstDependents = <ProviderElementBase<Object?>>[];
335-
firstElement.visitChildren(
336-
elementVisitor: firstDependents.add,
337-
notifierVisitor: (_) {},
338-
);
324+
firstElement.visitChildren(firstDependents.add);
339325
expect(firstDependents, <ProviderElement<Object?>>{});
340326
expect(firstElement.hasListeners, false);
341327
});

0 commit comments

Comments
 (0)