Skip to content

Commit a5b5994

Browse files
committed
feat: add scrollNotificationPredicate
1 parent c4eaa9e commit a5b5994

File tree

4 files changed

+26
-0
lines changed

4 files changed

+26
-0
lines changed

lib/src/common/observer_widget.dart

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,16 @@ class ObserverWidget<C extends ObserverController, M extends ObserveModel,
4848
/// child widget.
4949
final double toNextOverPercent;
5050

51+
/// A predicate for [ScrollNotification], used to determine whether
52+
/// observation can be triggered.
53+
///
54+
/// Generally combined with [defaultScrollNotificationPredicate] to check
55+
/// whether `notification.depth == 0`, which means that the notification did
56+
/// not bubble through any intervening scrolling widgets.
57+
/// This can avoid the unnecessary observation calculations caused by
58+
/// intervening scrolling widgets, which in turn improves performance.
59+
final ScrollNotificationPredicate? scrollNotificationPredicate;
60+
5161
/// Used to set types those can trigger observe automatically.
5262
///
5363
/// Defaults to [.scrollStart, .scrollUpdate, .scrollEnd]
@@ -78,6 +88,7 @@ class ObserverWidget<C extends ObserverController, M extends ObserveModel,
7888
this.leadingOffset = 0,
7989
this.dynamicLeadingOffset,
8090
this.toNextOverPercent = 1,
91+
this.scrollNotificationPredicate,
8192
this.autoTriggerObserveTypes,
8293
this.triggerOnObserveType =
8394
ObserverTriggerOnObserveType.displayingItemsChange,
@@ -152,6 +163,15 @@ class ObserverWidgetState<
152163
},
153164
child: NotificationListener<ScrollNotification>(
154165
onNotification: (notification) {
166+
// If the scrollNotificationPredicate returns false, the notification
167+
// will be ignored.
168+
if (!(widget.scrollNotificationPredicate?.call(notification) ??
169+
true)) {
170+
return false;
171+
}
172+
// If the notification.runtimeType is not in the list of
173+
// innerAutoTriggerObserveScrollNotifications that can trigger
174+
// observation, the notification will be ignored.
155175
if (innerAutoTriggerObserveScrollNotifications
156176
.contains(notification.runtimeType)) {
157177
final isIgnoreInnerCanHandleObserve =

lib/src/gridview/grid_observer_view.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ class GridViewObserver extends ObserverWidget<GridObserverController,
3131
double leadingOffset = 0,
3232
double Function()? dynamicLeadingOffset,
3333
double toNextOverPercent = 1,
34+
ScrollNotificationPredicate? scrollNotificationPredicate,
3435
List<ObserverAutoTriggerObserveType>? autoTriggerObserveTypes,
3536
ObserverTriggerOnObserveType triggerOnObserveType =
3637
ObserverTriggerOnObserveType.displayingItemsChange,
@@ -46,6 +47,7 @@ class GridViewObserver extends ObserverWidget<GridObserverController,
4647
leadingOffset: leadingOffset,
4748
dynamicLeadingOffset: dynamicLeadingOffset,
4849
toNextOverPercent: toNextOverPercent,
50+
scrollNotificationPredicate: scrollNotificationPredicate,
4951
autoTriggerObserveTypes: autoTriggerObserveTypes,
5052
triggerOnObserveType: triggerOnObserveType,
5153
customHandleObserve: customHandleObserve,

lib/src/listview/list_observer_view.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ class ListViewObserver extends ObserverWidget<ListObserverController,
3131
double leadingOffset = 0,
3232
double Function()? dynamicLeadingOffset,
3333
double toNextOverPercent = 1,
34+
ScrollNotificationPredicate? scrollNotificationPredicate,
3435
List<ObserverAutoTriggerObserveType>? autoTriggerObserveTypes,
3536
ObserverTriggerOnObserveType triggerOnObserveType =
3637
ObserverTriggerOnObserveType.displayingItemsChange,
@@ -46,6 +47,7 @@ class ListViewObserver extends ObserverWidget<ListObserverController,
4647
leadingOffset: leadingOffset,
4748
dynamicLeadingOffset: dynamicLeadingOffset,
4849
toNextOverPercent: toNextOverPercent,
50+
scrollNotificationPredicate: scrollNotificationPredicate,
4951
autoTriggerObserveTypes: autoTriggerObserveTypes,
5052
triggerOnObserveType: triggerOnObserveType,
5153
customHandleObserve: customHandleObserve,

lib/src/sliver/sliver_observer_view.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ class SliverViewObserver extends ObserverWidget<SliverObserverController,
5151
double Function()? dynamicLeadingOffset,
5252
this.customOverlap,
5353
double toNextOverPercent = 1,
54+
ScrollNotificationPredicate? scrollNotificationPredicate,
5455
List<ObserverAutoTriggerObserveType>? autoTriggerObserveTypes,
5556
ObserverTriggerOnObserveType triggerOnObserveType =
5657
ObserverTriggerOnObserveType.displayingItemsChange,
@@ -66,6 +67,7 @@ class SliverViewObserver extends ObserverWidget<SliverObserverController,
6667
leadingOffset: leadingOffset,
6768
dynamicLeadingOffset: dynamicLeadingOffset,
6869
toNextOverPercent: toNextOverPercent,
70+
scrollNotificationPredicate: scrollNotificationPredicate,
6971
autoTriggerObserveTypes: autoTriggerObserveTypes,
7072
triggerOnObserveType: triggerOnObserveType,
7173
customHandleObserve: customHandleObserve,

0 commit comments

Comments
 (0)