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 = [];