| // 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); |
| } |
| } |