// Copyright 2014 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import 'package:flutter/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { testWidgets('Can call setState from didUpdateWidget', (WidgetTester tester) async { await tester.pumpWidget(const Directionality( textDirection: TextDirection.ltr, child: WidgetUnderTest(text: 'hello'), )); expect(find.text('hello'), findsOneWidget); expect(find.text('world'), findsNothing); final _WidgetUnderTestState state = tester.state<_WidgetUnderTestState>(find.byType(WidgetUnderTest)); expect(state.setStateCalled, 0); expect(state.didUpdateWidgetCalled, 0); await tester.pumpWidget(const Directionality( textDirection: TextDirection.ltr, child: WidgetUnderTest(text: 'world'), )); expect(find.text('world'), findsOneWidget); expect(find.text('hello'), findsNothing); expect(state.setStateCalled, 1); expect(state.didUpdateWidgetCalled, 1); }); } class WidgetUnderTest extends StatefulWidget { const WidgetUnderTest({super.key, required this.text}); final String text; @override State<WidgetUnderTest> createState() => _WidgetUnderTestState(); } class _WidgetUnderTestState extends State<WidgetUnderTest> { late String text = widget.text; int setStateCalled = 0; int didUpdateWidgetCalled = 0; @override void didUpdateWidget(WidgetUnderTest oldWidget) { super.didUpdateWidget(oldWidget); didUpdateWidgetCalled += 1; if (oldWidget.text != widget.text) { // This setState is load bearing for the test. setState(() { text = widget.text; }); } } @override void setState(VoidCallback fn) { super.setState(fn); setStateCalled += 1; } @override Widget build(BuildContext context) { return Text(text); } }