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..062cc107 100644 --- a/packages/scrollable_positioned_list/lib/src/scrollable_positioned_list.dart +++ b/packages/scrollable_positioned_list/lib/src/scrollable_positioned_list.dart @@ -338,15 +338,7 @@ class _ScrollablePositionedListState extends State widget.scrollOffsetController?._attach(this); primary.itemPositionsNotifier.itemPositions.addListener(_updatePositions); secondary.itemPositionsNotifier.itemPositions.addListener(_updatePositions); - primary.scrollController.addListener(() { - final currentOffset = primary.scrollController.offset; - final offsetChange = currentOffset - previousOffset; - previousOffset = currentOffset; - if (!_isTransitioning | - (widget.scrollOffsetNotifier?.recordProgrammaticScrolls ?? false)) { - widget.scrollOffsetNotifier?.changeController.add(offsetChange); - } - }); + primary.scrollController.addListener(_scrollListener); } @override @@ -369,6 +361,7 @@ class _ScrollablePositionedListState extends State .removeListener(_updatePositions); secondary.itemPositionsNotifier.itemPositions .removeListener(_updatePositions); + primary.scrollController.removeListener(_scrollListener); _animationController?.dispose(); super.dispose(); } @@ -612,9 +605,11 @@ class _ScrollablePositionedListState extends State if (opacity.value >= 0.5) { // Secondary [ListView] is more visible than the primary; make it the // new primary. + primary.scrollController.removeListener(_scrollListener); var temp = primary; primary = secondary; secondary = temp; + primary.scrollController.addListener(_scrollListener); } _isTransitioning = false; opacity.parent = const AlwaysStoppedAnimation(0); @@ -652,6 +647,16 @@ class _ScrollablePositionedListState extends State } widget.itemPositionsNotifier?.itemPositions.value = itemPositions; } + + void _scrollListener() { + final currentOffset = primary.scrollController.offset; + final offsetChange = currentOffset - previousOffset; + previousOffset = currentOffset; + if (!_isTransitioning | + (widget.scrollOffsetNotifier?.recordProgrammaticScrolls ?? false)) { + widget.scrollOffsetNotifier?.changeController.add(offsetChange); + } + } } class _ListDisplayDetails {