diff --git a/packages/flutter/lib/src/material/user_accounts_drawer_header.dart b/packages/flutter/lib/src/material/user_accounts_drawer_header.dart index 0efde2baef..0f88add36e 100644 --- a/packages/flutter/lib/src/material/user_accounts_drawer_header.dart +++ b/packages/flutter/lib/src/material/user_accounts_drawer_header.dart @@ -113,8 +113,12 @@ class _AccountDetailsState extends State<_AccountDetails> with SingleTickerProvi @override void didUpdateWidget (_AccountDetails oldWidget) { super.didUpdateWidget(oldWidget); - if (_animation.status == AnimationStatus.dismissed || - _animation.status == AnimationStatus.reverse) { + // If the state of the arrow did not change, there is no need to trigger the animation + if (oldWidget.isOpen == widget.isOpen) { + return; + } + + if (widget.isOpen) { _controller.forward(); } else { _controller.reverse(); diff --git a/packages/flutter/test/material/user_accounts_drawer_header_test.dart b/packages/flutter/test/material/user_accounts_drawer_header_test.dart index 6d997362ed..5a9387c975 100644 --- a/packages/flutter/test/material/user_accounts_drawer_header_test.dart +++ b/packages/flutter/test/material/user_accounts_drawer_header_test.dart @@ -139,6 +139,42 @@ void main() { expect(transformWidget.transform.getRotation()[4], 1.0); }); + // Regression test for https://github.com/flutter/flutter/issues/25801. + testWidgets('UserAccountsDrawerHeader icon does not rotate after setState', (WidgetTester tester) async { + StateSetter testSetState; + await tester.pumpWidget(MaterialApp( + home: Material( + child: StatefulBuilder( + builder: (BuildContext context, StateSetter setState) { + testSetState = setState; + return UserAccountsDrawerHeader( + onDetailsPressed: () { }, + accountName: const Text('name'), + accountEmail: const Text('email'), + ); + }, + ), + ), + )); + + Transform transformWidget = tester.firstWidget(find.byType(Transform)); + + // Icon is right side up. + expect(transformWidget.transform.getRotation()[0], 1.0); + expect(transformWidget.transform.getRotation()[4], 1.0); + + testSetState(() { }); + await tester.pump(const Duration(milliseconds: 10)); + expect(tester.hasRunningAnimations, isFalse); + + await tester.pumpAndSettle(); + transformWidget = tester.firstWidget(find.byType(Transform)); + + // Icon has not rotated. + expect(transformWidget.transform.getRotation()[0], 1.0); + expect(transformWidget.transform.getRotation()[4], 1.0); + }); + testWidgets('UserAccountsDrawerHeader icon rotation test speeeeeedy', (WidgetTester tester) async { await pumpTestWidget(tester); Transform transformWidget = tester.firstWidget(find.byType(Transform));