diff --git a/packages/flutter/test/material/tabs_test.dart b/packages/flutter/test/material/tabs_test.dart index 79b8aeecfb0..8db8ac42eb4 100644 --- a/packages/flutter/test/material/tabs_test.dart +++ b/packages/flutter/test/material/tabs_test.dart @@ -6993,4 +6993,44 @@ void main() { expect(tabTwoRect.right, moreOrLessEquals(tabTwoRight)); }); }); + + testWidgets('does not crash if switching to a newly added tab', (WidgetTester tester) async { + // Regression test for https://github.com/flutter/flutter/issues/144087. + Widget buildTabs(int tabCount) { + return boilerplate( + child: DefaultTabController( + length: tabCount, + child: Scaffold( + appBar: AppBar( + title: const Text('Flutter Demo Click Counter'), + bottom: TabBar( + tabAlignment: TabAlignment.start, + isScrollable: true, + tabs: List.generate(tabCount, (int i) => Tab(text: 'Tab $i')), + ), + ), + body: TabBarView( + children: List.generate(tabCount, (int i) => Text('View $i')), + ), + ), + ), + ); + } + + await tester.pumpWidget(buildTabs(1)); + expect(tester.widgetList(find.byType(Tab)), hasLength(1)); + + await tester.pumpWidget(buildTabs(2)); + expect(tester.widgetList(find.byType(Tab)), hasLength(2)); + + await tester.pumpWidget(buildTabs(3)); + expect(tester.widgetList(find.byType(Tab)), hasLength(3)); + + expect(find.text('View 0'), findsOneWidget); + expect(find.text('View 2'), findsNothing); + await tester.tap(find.text('Tab 2')); + await tester.pumpAndSettle(); + expect(find.text('View 0'), findsNothing); + expect(find.text('View 2'), findsOneWidget); + }); }