From 13fe079bb3ddeebded7253f312ba7cc4c81feafc Mon Sep 17 00:00:00 2001 From: chunhtai <47866232+chunhtai@users.noreply.github.com> Date: Mon, 1 Feb 2021 12:46:05 -0800 Subject: [PATCH] fixes preceision error during SliverGridRegularTileLayout (#74851) --- .../lib/src/rendering/sliver_grid.dart | 2 +- .../flutter/test/widgets/grid_view_test.dart | 24 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/packages/flutter/lib/src/rendering/sliver_grid.dart b/packages/flutter/lib/src/rendering/sliver_grid.dart index c38a41e385e..e73587faabd 100644 --- a/packages/flutter/lib/src/rendering/sliver_grid.dart +++ b/packages/flutter/lib/src/rendering/sliver_grid.dart @@ -194,7 +194,7 @@ class SliverGridRegularTileLayout extends SliverGridLayout { @override int getMinChildIndexForScrollOffset(double scrollOffset) { - return mainAxisStride > 0.0 ? crossAxisCount * (scrollOffset ~/ mainAxisStride) : 0; + return mainAxisStride > precisionErrorTolerance ? crossAxisCount * (scrollOffset ~/ mainAxisStride) : 0; } @override diff --git a/packages/flutter/test/widgets/grid_view_test.dart b/packages/flutter/test/widgets/grid_view_test.dart index 276e4da80ec..4376e1a7485 100644 --- a/packages/flutter/test/widgets/grid_view_test.dart +++ b/packages/flutter/test/widgets/grid_view_test.dart @@ -315,6 +315,30 @@ void main() { expect(find.text('4'), findsNothing); }); + testWidgets('SliverGridRegularTileLayout - can handle close to zero mainAxisStride', (WidgetTester tester) async { + const SliverGridDelegateWithMaxCrossAxisExtent delegate = SliverGridDelegateWithMaxCrossAxisExtent( + childAspectRatio: 1e300, + maxCrossAxisExtent: 500.0, + ); + final SliverGridLayout layout = delegate.getLayout( + const SliverConstraints( + axisDirection: AxisDirection.down, + growthDirection: GrowthDirection.forward, + userScrollDirection: ScrollDirection.forward, + scrollOffset: 100.0, + precedingScrollExtent: 0.0, + overlap: 0.0, + remainingPaintExtent: 0.0, + crossAxisExtent: 500, + crossAxisDirection: AxisDirection.right, + viewportMainAxisExtent: 100.0, + remainingCacheExtent: 0.0, + cacheOrigin: 0.0, + ) + ); + expect(layout.getMinChildIndexForScrollOffset(1000.0), 0.0); + }); + testWidgets('GridView - change maxChildCrossAxisExtent', (WidgetTester tester) async { final List log = [];