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'),
             ),
           ),
         );