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..3af4bf12 100644 --- a/packages/scrollable_positioned_list/lib/src/scrollable_positioned_list.dart +++ b/packages/scrollable_positioned_list/lib/src/scrollable_positioned_list.dart @@ -279,6 +279,10 @@ class ItemScrollController { /// This is an experimental API and is subject to change. /// Behavior may be ill-defined in some cases. Please file bugs. class ScrollOffsetController { + + ScrollPosition get position => _scrollableListState!.primary.scrollController.position; + Offset get offset => _scrollableListState!.primary.scrollController.offset; + Future animateScroll( {required double offset, required Duration duration, @@ -293,6 +297,12 @@ class ScrollOffsetController { ); } + void jumpToOffset(double offset){ + final currentPosition = _scrollableListState!.primary.scrollController.offset; + final newPosition = currentPosition + offset; + _scrollableListState!.primary.scrollController.jumpTo(newPosition); + } + _ScrollablePositionedListState? _scrollableListState; void _attach(_ScrollablePositionedListState scrollableListState) { diff --git a/packages/scrollable_positioned_list/test/scroll_offset_controller_test.dart b/packages/scrollable_positioned_list/test/scroll_offset_controller_test.dart index 31ffc7f3..03a3f593 100644 --- a/packages/scrollable_positioned_list/test/scroll_offset_controller_test.dart +++ b/packages/scrollable_positioned_list/test/scroll_offset_controller_test.dart @@ -225,4 +225,28 @@ void main() { await tester.pumpAndSettle(); }); + + testWidgets('Programtically jump down 50 pixels', + (WidgetTester tester) async { + final scrollDistance = 50.0; + + ScrollOffsetController scrollOffsetController = ScrollOffsetController(); + + await setUpWidgetTest( + tester, + scrollOffsetController: scrollOffsetController, + initialIndex: 5, + ); + + final originalOffest = tester.getTopLeft(find.text('Item 5')).dy; + + scrollOffsetController.jumpToOffset(-scrollDistance); + await tester.pumpAndSettle(); + + final newOffset = tester.getTopLeft(find.text('Item 5')).dy; + + expect(newOffset - originalOffest, scrollDistance); + }); + + }