Fix ScrollOffset calculation when childCount is null (#17722)
diff --git a/AUTHORS b/AUTHORS
index fd1df22..4516816 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -22,3 +22,4 @@
Ali Bitek <alibitek@protonmail.ch>
Tetsuhiro Ueda <najeira@gmail.com>
Dan Field <dfield@gmail.com>
+Noah Groß <gross@ngsger.de>
diff --git a/packages/flutter/lib/src/widgets/sliver.dart b/packages/flutter/lib/src/widgets/sliver.dart
index 38a3cba..8ff5b79 100644
--- a/packages/flutter/lib/src/widgets/sliver.dart
+++ b/packages/flutter/lib/src/widgets/sliver.dart
@@ -779,15 +779,13 @@
});
}
- 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 @@
double leadingScrollOffset,
double trailingScrollOffset,
}) {
+ final int childCount = this.childCount;
+ if (childCount == null)
+ return double.infinity;
return widget.estimateMaxScrollOffset(
constraints,
firstIndex,
@@ -814,6 +815,7 @@
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 6e8641a..781e67c 100644
--- a/packages/flutter/test/widgets/grid_view_test.dart
+++ b/packages/flutter/test/widgets/grid_view_test.dart
@@ -481,6 +481,30 @@
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();