From 64a28e3685bee310e697a91612d7e30d0426cda2 Mon Sep 17 00:00:00 2001 From: rami-a <2364772+rami-a@users.noreply.github.com> Date: Wed, 27 Mar 2019 11:19:22 -0400 Subject: [PATCH] Fix issue with account drawer header arrow rotating when setState is called (#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 #25801 --- .../material/user_accounts_drawer_header.dart | 8 +++-- .../user_accounts_drawer_header_test.dart | 36 +++++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) 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));