From 5726025ed0b34f338abf8d4fff38e59406ae6dc5 Mon Sep 17 00:00:00 2001 From: robinsontom Date: Tue, 2 May 2023 15:40:45 -0700 Subject: [PATCH 1/2] [scrollable_positioned_list] Fix manual scrolling accuracy. Previously the GestureDetector caused the ScrollablePositionedList to loose a few pixels when scrolling started. Part of work on #41. --- .../lib/src/scrollable_positioned_list.dart | 5 ++--- .../test/scrollable_positioned_list_test.dart | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 3 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 82526a08..b73eaf97 100644 --- a/packages/scrollable_positioned_list/lib/src/scrollable_positioned_list.dart +++ b/packages/scrollable_positioned_list/lib/src/scrollable_positioned_list.dart @@ -338,9 +338,8 @@ class _ScrollablePositionedListState extends State return LayoutBuilder( builder: (context, constraints) { final cacheExtent = _cacheExtent(constraints); - return GestureDetector( - onPanDown: (_) => _stopScroll(canceled: true), - excludeFromSemantics: true, + return Listener( + onPointerDown: (_) => _stopScroll(canceled: true), child: Stack( children: [ PostMountCallback( diff --git a/packages/scrollable_positioned_list/test/scrollable_positioned_list_test.dart b/packages/scrollable_positioned_list/test/scrollable_positioned_list_test.dart index 7c275a70..7a74b391 100644 --- a/packages/scrollable_positioned_list/test/scrollable_positioned_list_test.dart +++ b/packages/scrollable_positioned_list/test/scrollable_positioned_list_test.dart @@ -2266,6 +2266,24 @@ void main() { expect(find.text('Item 70'), findsOneWidget); expect(find.text('Item 50'), findsOneWidget); }); + + testWidgets('List positioned with 5 at top then scroll up so item 3 is at top', + (WidgetTester tester) async { + // debugPrintGestureArenaDiagnostics = true; + final itemPositionsListener = ItemPositionsListener.create(); + await setUpWidgetTest(tester, + initialIndex: 5, itemPositionsListener: itemPositionsListener); + + await tester.drag( + find.byType(ScrollablePositionedList), const Offset(0, 2 * itemHeight)); + await tester.pumpAndSettle(); + + expect( + itemPositionsListener.itemPositions.value + .firstWhere((position) => position.index == 3) + .itemLeadingEdge, + 0); + }); } bool collectSemanticNodes(SemanticsNode root, List nodes) { From 503365c12c466e487a2b51a8b34b103b8bf5ae05 Mon Sep 17 00:00:00 2001 From: robinsontom Date: Tue, 2 May 2023 15:50:20 -0700 Subject: [PATCH 2/2] Fix formatting --- .../test/scrollable_positioned_list_test.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/scrollable_positioned_list/test/scrollable_positioned_list_test.dart b/packages/scrollable_positioned_list/test/scrollable_positioned_list_test.dart index 7a74b391..abbfbb16 100644 --- a/packages/scrollable_positioned_list/test/scrollable_positioned_list_test.dart +++ b/packages/scrollable_positioned_list/test/scrollable_positioned_list_test.dart @@ -2267,7 +2267,8 @@ void main() { expect(find.text('Item 50'), findsOneWidget); }); - testWidgets('List positioned with 5 at top then scroll up so item 3 is at top', + testWidgets( + 'List positioned with 5 at top then scroll up so item 3 is at top', (WidgetTester tester) async { // debugPrintGestureArenaDiagnostics = true; final itemPositionsListener = ItemPositionsListener.create();