From a1bed2686db333e823b659c6c2befd1f1621dae7 Mon Sep 17 00:00:00 2001 From: Andrey Garanin Date: Tue, 25 Jul 2023 10:19:01 +0300 Subject: [PATCH 1/2] add scroll controller --- .../lib/src/scrollable_positioned_list.dart | 12 ++++++++++++ 1 file changed, 12 insertions(+) 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..0aa4039c 100644 --- a/packages/scrollable_positioned_list/lib/src/scrollable_positioned_list.dart +++ b/packages/scrollable_positioned_list/lib/src/scrollable_positioned_list.dart @@ -42,6 +42,7 @@ class ScrollablePositionedList extends StatefulWidget { required this.itemBuilder, Key? key, this.itemScrollController, + this.scrollController, this.shrinkWrap = false, ItemPositionsListener? itemPositionsListener, this.scrollOffsetController, @@ -73,6 +74,7 @@ class ScrollablePositionedList extends StatefulWidget { Key? key, this.shrinkWrap = false, this.itemScrollController, + this.scrollController, ItemPositionsListener? itemPositionsListener, this.scrollOffsetController, ScrollOffsetListener? scrollOffsetListener, @@ -94,6 +96,8 @@ class ScrollablePositionedList extends StatefulWidget { scrollOffsetNotifier = scrollOffsetListener as ScrollOffsetNotifier?, super(key: key); + final ScrollController? scrollController; + /// Number of items the [itemBuilder] can produce. final int itemCount; @@ -405,6 +409,11 @@ class _ScrollablePositionedListState extends State @override Widget build(BuildContext context) { + if (widget.scrollController?.positions.isEmpty == true) + WidgetsBinding.instance.addPostFrameCallback((_) { + widget.scrollController?.attach(primary.scrollController.position); + }); + return LayoutBuilder( builder: (context, constraints) { final cacheExtent = _cacheExtent(constraints); @@ -610,6 +619,9 @@ class _ScrollablePositionedListState extends State if (mounted) { setState(() { if (opacity.value >= 0.5) { + if (widget.scrollController?.position != null) { + widget.scrollController?.detach(widget.scrollController!.position); + } // Secondary [ListView] is more visible than the primary; make it the // new primary. var temp = primary; From 7ce518dbca6547a3d468e4459b14d674e8db4400 Mon Sep 17 00:00:00 2001 From: Andrey Garanin Date: Thu, 27 Feb 2025 18:44:08 +0300 Subject: [PATCH 2/2] scroll_positioned_list - add animateScrollAbsolute --- .../lib/src/scrollable_positioned_list.dart | 27 +++++++++++++------ 1 file changed, 19 insertions(+), 8 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 0aa4039c..36eba0c8 100644 --- a/packages/scrollable_positioned_list/lib/src/scrollable_positioned_list.dart +++ b/packages/scrollable_positioned_list/lib/src/scrollable_positioned_list.dart @@ -287,25 +287,36 @@ class ScrollOffsetController { {required double offset, required Duration duration, Curve curve = Curves.linear}) async { - final currentPosition = - _scrollableListState!.primary.scrollController.offset; + final currentPosition = + scrollableListState!.primary.scrollController.offset; final newPosition = currentPosition + offset; - await _scrollableListState!.primary.scrollController.animateTo( + await scrollableListState!.primary.scrollController.animateTo( newPosition, duration: duration, curve: curve, ); } - _ScrollablePositionedListState? _scrollableListState; + Future animateScrollAbsolute( + {required double offset, + required Duration duration, + Curve curve = Curves.linear}) async { + await scrollableListState!.primary.scrollController.animateTo( + offset, + duration: duration, + curve: curve, + ); + } - void _attach(_ScrollablePositionedListState scrollableListState) { - assert(_scrollableListState == null); - _scrollableListState = scrollableListState; + _ScrollablePositionedListState? scrollableListState; + + void _attach(_ScrollablePositionedListState _scrollableListState) { + assert(scrollableListState == null); + scrollableListState = _scrollableListState; } void _detach() { - _scrollableListState = null; + scrollableListState = null; } }