1// Copyright 2014 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5import 'package:flutter/widgets.dart';
6import 'package:flutter_test/flutter_test.dart';
7
8void main() {
9 testWidgets('Can call setState from didUpdateWidget', (WidgetTester tester) async {
10 await tester.pumpWidget(
11 const Directionality(
12 textDirection: TextDirection.ltr,
13 child: WidgetUnderTest(text: 'hello'),
14 ),
15 );
16
17 expect(find.text('hello'), findsOneWidget);
18 expect(find.text('world'), findsNothing);
19 final _WidgetUnderTestState state = tester.state<_WidgetUnderTestState>(
20 find.byType(WidgetUnderTest),
21 );
22 expect(state.setStateCalled, 0);
23 expect(state.didUpdateWidgetCalled, 0);
24
25 await tester.pumpWidget(
26 const Directionality(
27 textDirection: TextDirection.ltr,
28 child: WidgetUnderTest(text: 'world'),
29 ),
30 );
31
32 expect(find.text('world'), findsOneWidget);
33 expect(find.text('hello'), findsNothing);
34 expect(state.setStateCalled, 1);
35 expect(state.didUpdateWidgetCalled, 1);
36 });
37}
38
39class WidgetUnderTest extends StatefulWidget {
40 const WidgetUnderTest({super.key, required this.text});
41
42 final String text;
43
44 @override
45 State<WidgetUnderTest> createState() => _WidgetUnderTestState();
46}
47
48class _WidgetUnderTestState extends State<WidgetUnderTest> {
49 late String text = widget.text;
50
51 int setStateCalled = 0;
52 int didUpdateWidgetCalled = 0;
53
54 @override
55 void didUpdateWidget(WidgetUnderTest oldWidget) {
56 super.didUpdateWidget(oldWidget);
57 didUpdateWidgetCalled += 1;
58 if (oldWidget.text != widget.text) {
59 // This setState is load bearing for the test.
60 setState(() {
61 text = widget.text;
62 });
63 }
64 }
65
66 @override
67 void setState(VoidCallback fn) {
68 super.setState(fn);
69 setStateCalled += 1;
70 }
71
72 @override
73 Widget build(BuildContext context) {
74 return Text(text);
75 }
76}
77