Skip to content

Commit 64a28e3

Browse files
authored
Fix issue with account drawer header arrow rotating when setState is called (flutter#29980)
The UserAccountsDrawerHeader had a bug with the arrow rotating whenever setState was called on its parent. This change makes sure that we check that the state actually changed before allowing the animation to trigger. Fixes flutter#25801
1 parent bafe7cb commit 64a28e3

File tree

2 files changed

+42
-2
lines changed

2 files changed

+42
-2
lines changed

packages/flutter/lib/src/material/user_accounts_drawer_header.dart

+6-2
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,12 @@ class _AccountDetailsState extends State<_AccountDetails> with SingleTickerProvi
113113
@override
114114
void didUpdateWidget (_AccountDetails oldWidget) {
115115
super.didUpdateWidget(oldWidget);
116-
if (_animation.status == AnimationStatus.dismissed ||
117-
_animation.status == AnimationStatus.reverse) {
116+
// If the state of the arrow did not change, there is no need to trigger the animation
117+
if (oldWidget.isOpen == widget.isOpen) {
118+
return;
119+
}
120+
121+
if (widget.isOpen) {
118122
_controller.forward();
119123
} else {
120124
_controller.reverse();

packages/flutter/test/material/user_accounts_drawer_header_test.dart

+36
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,42 @@ void main() {
139139
expect(transformWidget.transform.getRotation()[4], 1.0);
140140
});
141141

142+
// Regression test for https://github.com/flutter/flutter/issues/25801.
143+
testWidgets('UserAccountsDrawerHeader icon does not rotate after setState', (WidgetTester tester) async {
144+
StateSetter testSetState;
145+
await tester.pumpWidget(MaterialApp(
146+
home: Material(
147+
child: StatefulBuilder(
148+
builder: (BuildContext context, StateSetter setState) {
149+
testSetState = setState;
150+
return UserAccountsDrawerHeader(
151+
onDetailsPressed: () { },
152+
accountName: const Text('name'),
153+
accountEmail: const Text('email'),
154+
);
155+
},
156+
),
157+
),
158+
));
159+
160+
Transform transformWidget = tester.firstWidget(find.byType(Transform));
161+
162+
// Icon is right side up.
163+
expect(transformWidget.transform.getRotation()[0], 1.0);
164+
expect(transformWidget.transform.getRotation()[4], 1.0);
165+
166+
testSetState(() { });
167+
await tester.pump(const Duration(milliseconds: 10));
168+
expect(tester.hasRunningAnimations, isFalse);
169+
170+
await tester.pumpAndSettle();
171+
transformWidget = tester.firstWidget(find.byType(Transform));
172+
173+
// Icon has not rotated.
174+
expect(transformWidget.transform.getRotation()[0], 1.0);
175+
expect(transformWidget.transform.getRotation()[4], 1.0);
176+
});
177+
142178
testWidgets('UserAccountsDrawerHeader icon rotation test speeeeeedy', (WidgetTester tester) async {
143179
await pumpTestWidget(tester);
144180
Transform transformWidget = tester.firstWidget(find.byType(Transform));

0 commit comments

Comments
 (0)