From eda3167ac65327621040a28f2a9072f1ccd71702 Mon Sep 17 00:00:00 2001 From: ng1905 Date: Tue, 22 May 2018 00:39:09 +0200 Subject: [PATCH] Fix ScrollOffset calculation when childCount is null (#17722) --- AUTHORS | 1 + packages/flutter/lib/src/widgets/sliver.dart | 10 ++++---- .../flutter/test/widgets/grid_view_test.dart | 24 +++++++++++++++++++ 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/AUTHORS b/AUTHORS index fd1df224fe..4516816920 100644 --- a/AUTHORS +++ b/AUTHORS @@ -22,3 +22,4 @@ Fredrik Simón Ali Bitek Tetsuhiro Ueda Dan Field +Noah Groß diff --git a/packages/flutter/lib/src/widgets/sliver.dart b/packages/flutter/lib/src/widgets/sliver.dart index 38a3cba5ab..8ff5b7988e 100644 --- a/packages/flutter/lib/src/widgets/sliver.dart +++ b/packages/flutter/lib/src/widgets/sliver.dart @@ -779,15 +779,13 @@ class SliverMultiBoxAdaptorElement extends RenderObjectElement implements Render }); } - double _extrapolateMaxScrollOffset( + static double _extrapolateMaxScrollOffset( int firstIndex, int lastIndex, double leadingScrollOffset, double trailingScrollOffset, + int childCount, ) { - final int childCount = this.childCount; - if (childCount == null) - return double.infinity; if (lastIndex == childCount - 1) return trailingScrollOffset; final int reifiedCount = lastIndex - firstIndex + 1; @@ -803,6 +801,9 @@ class SliverMultiBoxAdaptorElement extends RenderObjectElement implements Render double leadingScrollOffset, double trailingScrollOffset, }) { + final int childCount = this.childCount; + if (childCount == null) + return double.infinity; return widget.estimateMaxScrollOffset( constraints, firstIndex, @@ -814,6 +815,7 @@ class SliverMultiBoxAdaptorElement extends RenderObjectElement implements Render lastIndex, leadingScrollOffset, trailingScrollOffset, + childCount, ); } diff --git a/packages/flutter/test/widgets/grid_view_test.dart b/packages/flutter/test/widgets/grid_view_test.dart index 6e8641a93c..781e67c808 100644 --- a/packages/flutter/test/widgets/grid_view_test.dart +++ b/packages/flutter/test/widgets/grid_view_test.dart @@ -481,6 +481,30 @@ void main() { expect(find.text('12'), findsNothing); }); + testWidgets('GridView.builder with undefined itemCount', (WidgetTester tester) async { + await tester.pumpWidget( + new Directionality( + textDirection: TextDirection.ltr, + child: new GridView.builder( + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 4, + ), + shrinkWrap: true, + itemBuilder: (BuildContext context, int index) { + return new Container( + child: new Text('$index'), + ); + }, + ), + ), + ); + expect(find.text('0'), findsOneWidget); + expect(find.text('11'), findsOneWidget); + await tester.drag(find.byType(GridView), const Offset(0.0, -300.0)); + await tester.pump(const Duration(milliseconds: 200)); + expect(find.text('13'), findsOneWidget); + }); + testWidgets('GridView cross axis layout', (WidgetTester tester) async { final Key target = new UniqueKey();