diff --git a/packages/flutter/lib/src/widgets/basic.dart b/packages/flutter/lib/src/widgets/basic.dart index 365597e619d..4118db4ee48 100644 --- a/packages/flutter/lib/src/widgets/basic.dart +++ b/packages/flutter/lib/src/widgets/basic.dart @@ -4265,7 +4265,13 @@ class _RawIndexedStack extends Stack { StackFit sizing = StackFit.loose, this.index = 0, super.children, - }) : super(fit: sizing); + }) : assert( + index == null || + (index == 0 && children.length == 0) || + (index >= 0 && index < children.length), + 'The index must be null or within the range of children.', + ), + super(fit: sizing); /// The index of the child to show. final int? index; diff --git a/packages/flutter/test/widgets/stack_test.dart b/packages/flutter/test/widgets/stack_test.dart index b5f1fef38cd..90cbc1121e6 100644 --- a/packages/flutter/test/widgets/stack_test.dart +++ b/packages/flutter/test/widgets/stack_test.dart @@ -1001,6 +1001,51 @@ void main() { 'BoxConstraints(2.0<=w<=3.0, 5.0<=h<=7.0)', ]); }); + + testWidgets('IndexedStack does not assert with the default parameters', ( + WidgetTester tester, + ) async { + await tester.pumpWidget( + const Directionality(textDirection: TextDirection.ltr, child: IndexedStack()), + ); + + expect(tester.takeException(), isNull); + }); + + testWidgets('IndexedStack does not assert when index is null', (WidgetTester tester) async { + await tester.pumpWidget( + const Directionality( + textDirection: TextDirection.ltr, + child: IndexedStack(index: null, children: [SizedBox.shrink(), SizedBox.shrink()]), + ), + ); + + expect(tester.takeException(), isNull); + }); + + testWidgets('IndexedStack asserts when index is negative', (WidgetTester tester) async { + await tester.pumpWidget( + const Directionality( + textDirection: TextDirection.ltr, + child: IndexedStack(index: -1, children: [SizedBox.shrink(), SizedBox.shrink()]), + ), + ); + + expect(tester.takeException(), isA()); + }); + + testWidgets('IndexedStack asserts when index is not in children range', ( + WidgetTester tester, + ) async { + await tester.pumpWidget( + const Directionality( + textDirection: TextDirection.ltr, + child: IndexedStack(index: 2, children: [SizedBox.shrink(), SizedBox.shrink()]), + ), + ); + + expect(tester.takeException(), isA()); + }); } class _ShowVisibility extends StatelessWidget {