From a4e185c26939eb7437f49edfa10c3de700e4baf5 Mon Sep 17 00:00:00 2001 From: David <39827040+Lootwig@users.noreply.github.com> Date: Tue, 12 Dec 2023 17:03:16 +0100 Subject: [PATCH 1/2] Allow listening to primary ScrollController Adds an optional callback to `ScrollablePositionedList` that provides access to updates on the primary ScrollController. --- .../lib/src/scrollable_positioned_list.dart | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/scrollable_positioned_list/lib/src/scrollable_positioned_list.dart b/packages/scrollable_positioned_list/lib/src/scrollable_positioned_list.dart index 60045e9b..a0163ff8 100644 --- a/packages/scrollable_positioned_list/lib/src/scrollable_positioned_list.dart +++ b/packages/scrollable_positioned_list/lib/src/scrollable_positioned_list.dart @@ -57,6 +57,7 @@ class ScrollablePositionedList extends StatefulWidget { this.addAutomaticKeepAlives = true, this.addRepaintBoundaries = true, this.minCacheExtent, + this.controllerListener, }) : assert(itemCount != null), assert(itemBuilder != null), itemPositionsNotifier = itemPositionsListener as ItemPositionsNotifier?, @@ -87,6 +88,7 @@ class ScrollablePositionedList extends StatefulWidget { this.addAutomaticKeepAlives = true, this.addRepaintBoundaries = true, this.minCacheExtent, + this.controllerListener, }) : assert(itemCount != null), assert(itemBuilder != null), assert(separatorBuilder != null), @@ -94,6 +96,10 @@ class ScrollablePositionedList extends StatefulWidget { scrollOffsetNotifier = scrollOffsetListener as ScrollOffsetNotifier?, super(key: key); + /// Optional listener for the primary scroll controller. + /// Called once after first frame. + final void Function(ScrollController controller)? controllerListener; + /// Number of items the [itemBuilder] can produce. final int itemCount; @@ -345,7 +351,10 @@ class _ScrollablePositionedListState extends State if (!_isTransitioning | (widget.scrollOffsetNotifier?.recordProgrammaticScrolls ?? false)) { widget.scrollOffsetNotifier?.changeController.add(offsetChange); - } + widget.controllerListener?.call(primary.scrollController); + }); + WidgetsBinding.instance!.addPostFrameCallback((_) { + widget.controllerListener?.call(primary.scrollController); }); } From a76bd71e3b20e5523a9b0a0f4fec99247bd220b4 Mon Sep 17 00:00:00 2001 From: david Date: Tue, 12 Dec 2023 21:03:03 +0100 Subject: [PATCH 2/2] fix: missing brace, remove redundant non-null assertion --- .../lib/src/scrollable_positioned_list.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/scrollable_positioned_list/lib/src/scrollable_positioned_list.dart b/packages/scrollable_positioned_list/lib/src/scrollable_positioned_list.dart index a0163ff8..ef3c1271 100644 --- a/packages/scrollable_positioned_list/lib/src/scrollable_positioned_list.dart +++ b/packages/scrollable_positioned_list/lib/src/scrollable_positioned_list.dart @@ -351,9 +351,10 @@ class _ScrollablePositionedListState extends State if (!_isTransitioning | (widget.scrollOffsetNotifier?.recordProgrammaticScrolls ?? false)) { widget.scrollOffsetNotifier?.changeController.add(offsetChange); - widget.controllerListener?.call(primary.scrollController); + widget.controllerListener?.call(primary.scrollController); + } }); - WidgetsBinding.instance!.addPostFrameCallback((_) { + WidgetsBinding.instance.addPostFrameCallback((_) { widget.controllerListener?.call(primary.scrollController); }); }