diff --git a/packages/flutter/lib/src/cupertino/button.dart b/packages/flutter/lib/src/cupertino/button.dart index 98341231184..10a6dbdd600 100644 --- a/packages/flutter/lib/src/cupertino/button.dart +++ b/packages/flutter/lib/src/cupertino/button.dart @@ -148,8 +148,8 @@ class CupertinoButton extends StatefulWidget { class _CupertinoButtonState extends State with SingleTickerProviderStateMixin { // Eyeballed values. Feel free to tweak. - static const Duration kFadeOutDuration = Duration(milliseconds: 10); - static const Duration kFadeInDuration = Duration(milliseconds: 100); + static const Duration kFadeOutDuration = Duration(milliseconds: 120); + static const Duration kFadeInDuration = Duration(milliseconds: 180); final Tween _opacityTween = Tween(begin: 1.0); late AnimationController _animationController; @@ -213,8 +213,8 @@ class _CupertinoButtonState extends State with SingleTickerProv return; final bool wasHeldDown = _buttonHeldDown; final TickerFuture ticker = _buttonHeldDown - ? _animationController.animateTo(1.0, duration: kFadeOutDuration) - : _animationController.animateTo(0.0, duration: kFadeInDuration); + ? _animationController.animateTo(1.0, duration: kFadeOutDuration, curve: Curves.easeInOutCubicEmphasized) + : _animationController.animateTo(0.0, duration: kFadeInDuration, curve: Curves.easeOutCubic); ticker.then((void value) { if (mounted && wasHeldDown != _buttonHeldDown) _animate(); diff --git a/packages/flutter/test/cupertino/button_test.dart b/packages/flutter/test/cupertino/button_test.dart index 3055e2e603d..5e39bb9734f 100644 --- a/packages/flutter/test/cupertino/button_test.dart +++ b/packages/flutter/test/cupertino/button_test.dart @@ -205,23 +205,27 @@ void main() { await tester.pump(); FadeTransition transition = tester.firstWidget(find.byType(FadeTransition)); - await tester.pump(const Duration(milliseconds: 25)); + await tester.pump(const Duration(milliseconds: 50)); transition = tester.firstWidget(find.byType(FadeTransition)); - expect(transition.opacity.value, moreOrLessEquals(0.4, epsilon: 0.001)); + expect(transition.opacity.value, moreOrLessEquals(0.403, epsilon: 0.001)); - await tester.pump(const Duration(milliseconds: 25)); + await tester.pump(const Duration(milliseconds: 100)); transition = tester.firstWidget(find.byType(FadeTransition)); - expect(transition.opacity.value, moreOrLessEquals(0.437, epsilon: 0.001)); + expect(transition.opacity.value, moreOrLessEquals(0.400, epsilon: 0.001)); - await tester.pump(const Duration(milliseconds: 25)); + await tester.pump(const Duration(milliseconds: 50)); transition = tester.firstWidget(find.byType(FadeTransition)); - expect(transition.opacity.value, moreOrLessEquals(0.55, epsilon: 0.001)); + expect(transition.opacity.value, moreOrLessEquals(0.650, epsilon: 0.001)); - await tester.pump(const Duration(milliseconds: 25)); + await tester.pump(const Duration(milliseconds: 50)); transition = tester.firstWidget(find.byType(FadeTransition)); - expect(transition.opacity.value, moreOrLessEquals(0.737, epsilon: 0.001)); + expect(transition.opacity.value, moreOrLessEquals(0.894, epsilon: 0.001)); - await tester.pump(const Duration(milliseconds: 25)); + await tester.pump(const Duration(milliseconds: 50)); + transition = tester.firstWidget(find.byType(FadeTransition)); + expect(transition.opacity.value, moreOrLessEquals(0.988, epsilon: 0.001)); + + await tester.pump(const Duration(milliseconds: 50)); transition = tester.firstWidget(find.byType(FadeTransition)); expect(transition.opacity.value, moreOrLessEquals(1.0, epsilon: 0.001)); });