Fix lower bound of children from TwoDimensionalChildBuilderDelegate (#132713)
Found in https://github.com/flutter/packages/pull/4536
The max x and max y index should allow for a case where there are no children in the viewport.
This should be CP'd into stable once it lands.
diff --git a/packages/flutter/lib/src/widgets/scroll_delegate.dart b/packages/flutter/lib/src/widgets/scroll_delegate.dart
index b81b9b0..6a816f1 100644
--- a/packages/flutter/lib/src/widgets/scroll_delegate.dart
+++ b/packages/flutter/lib/src/widgets/scroll_delegate.dart
@@ -933,8 +933,8 @@
int? maxYIndex,
this.addRepaintBoundaries = true,
this.addAutomaticKeepAlives = true,
- }) : assert(maxYIndex == null || maxYIndex >= 0),
- assert(maxXIndex == null || maxXIndex >= 0),
+ }) : assert(maxYIndex == null || maxYIndex >= -1),
+ assert(maxXIndex == null || maxXIndex >= -1),
_maxYIndex = maxYIndex,
_maxXIndex = maxXIndex;
@@ -976,7 +976,9 @@
/// [TwoDimensionalViewport] subclass to learn how this value is applied in
/// the specific use case.
///
- /// If not null, the value must be non-negative.
+ /// If not null, the value must be greater than or equal to -1, where -1
+ /// indicates there will be no children at all provided to the
+ /// [TwoDimensionalViewport].
///
/// If the value changes, the delegate will call [notifyListeners]. This
/// informs the [RenderTwoDimensionalViewport] that any cached information
@@ -997,7 +999,7 @@
if (value == maxXIndex) {
return;
}
- assert(value == null || value >= 0);
+ assert(value == null || value >= -1);
_maxXIndex = value;
notifyListeners();
}
@@ -1020,7 +1022,7 @@
if (maxYIndex == value) {
return;
}
- assert(value == null || value >= 0);
+ assert(value == null || value >= -1);
_maxYIndex = value;
notifyListeners();
}
diff --git a/packages/flutter/test/widgets/two_dimensional_viewport_test.dart b/packages/flutter/test/widgets/two_dimensional_viewport_test.dart
index 5d8f019..e65f531 100644
--- a/packages/flutter/test/widgets/two_dimensional_viewport_test.dart
+++ b/packages/flutter/test/widgets/two_dimensional_viewport_test.dart
@@ -120,27 +120,29 @@
}
);
// Update
+ delegate.maxXIndex = -1; // No exception.
expect(
() {
- delegate.maxXIndex = -1;
+ delegate.maxXIndex = -2;
},
throwsA(
isA<AssertionError>().having(
(AssertionError error) => error.toString(),
'description',
- contains('value == null || value >= 0'),
+ contains('value == null || value >= -1'),
),
),
);
+ delegate.maxYIndex = -1; // No exception
expect(
() {
- delegate.maxYIndex = -1;
+ delegate.maxYIndex = -2;
},
throwsA(
isA<AssertionError>().having(
(AssertionError error) => error.toString(),
'description',
- contains('value == null || value >= 0'),
+ contains('value == null || value >= -1'),
),
),
);
@@ -148,7 +150,7 @@
expect(
() {
TwoDimensionalChildBuilderDelegate(
- maxXIndex: -1,
+ maxXIndex: -2,
maxYIndex: 0,
builder: (BuildContext context, ChildVicinity vicinity) {
return const SizedBox.shrink();
@@ -159,7 +161,7 @@
isA<AssertionError>().having(
(AssertionError error) => error.toString(),
'description',
- contains('maxXIndex == null || maxXIndex >= 0'),
+ contains('maxXIndex == null || maxXIndex >= -1'),
),
),
);
@@ -167,7 +169,7 @@
() {
TwoDimensionalChildBuilderDelegate(
maxXIndex: 0,
- maxYIndex: -1,
+ maxYIndex: -2,
builder: (BuildContext context, ChildVicinity vicinity) {
return const SizedBox.shrink();
}
@@ -177,7 +179,7 @@
isA<AssertionError>().having(
(AssertionError error) => error.toString(),
'description',
- contains('maxYIndex == null || maxYIndex >= 0'),
+ contains('maxYIndex == null || maxYIndex >= -1'),
),
),
);