diff --git a/packages/flutter/lib/src/widgets/scroll_position.dart b/packages/flutter/lib/src/widgets/scroll_position.dart index f786d2b3e8..3712b9b976 100644 --- a/packages/flutter/lib/src/widgets/scroll_position.dart +++ b/packages/flutter/lib/src/widgets/scroll_position.dart @@ -368,7 +368,7 @@ abstract class ScrollPosition extends ViewportOffset with ScrollMetrics { notifyListeners(); didUpdateScrollPositionBy(pixels - oldPixels); } - if (overscroll != 0.0) { + if (overscroll.abs() > precisionErrorTolerance) { didOverscrollBy(overscroll); return overscroll; } diff --git a/packages/flutter/test/widgets/page_view_test.dart b/packages/flutter/test/widgets/page_view_test.dart index cbfbf95169..9b94146ee5 100644 --- a/packages/flutter/test/widgets/page_view_test.dart +++ b/packages/flutter/test/widgets/page_view_test.dart @@ -1203,4 +1203,46 @@ void main() { await tester.pump(); expect(tester.takeException(), isNull); }); + + testWidgets('PageView content should not be stretched on precision error', (WidgetTester tester) async { + // Regression test for https://github.com/flutter/flutter/issues/126561. + final PageController controller = PageController(); + + const double pixel6EmulatorWidth = 411.42857142857144; + + await tester.pumpWidget(MaterialApp( + theme: ThemeData(useMaterial3: true), + home: Center( + child: SizedBox( + width: pixel6EmulatorWidth, + child: PageView( + controller: controller, + physics: const PageScrollPhysics().applyTo(const ClampingScrollPhysics()), + children: const [ + Center(child: Text('First Page')), + Center(child: Text('Second Page')), + Center(child: Text('Third Page')), + ], + ), + ), + ), + )); + + controller.animateToPage(2, duration: const Duration(milliseconds: 300), curve: Curves.ease); + await tester.pumpAndSettle(); + + final Finder transformFinder = find.descendant(of: find.byType(PageView), matching: find.byType(Transform)); + expect(transformFinder, findsOneWidget); + + // Get the Transform widget that stretches the PageView. + final Transform transform = tester.firstWidget( + find.descendant( + of: find.byType(PageView), + matching: find.byType(Transform), + ), + ); + + // Check the stretch factor in the first element of the transform matrix. + expect(transform.transform.storage.first, 1.0); + }); }