diff --git a/packages/flutter/lib/src/material/dialog.dart b/packages/flutter/lib/src/material/dialog.dart index 0a36900c0e..cd17f761cf 100644 --- a/packages/flutter/lib/src/material/dialog.dart +++ b/packages/flutter/lib/src/material/dialog.dart @@ -1466,6 +1466,7 @@ Future showDialog({ Offset? anchorPoint, TraversalEdgeBehavior? traversalEdgeBehavior, bool? requestFocus, + AnimationStyle? animationStyle, }) { assert(_debugIsActive(context)); assert(debugCheckHasMaterialLocalizations(context)); @@ -1492,6 +1493,7 @@ Future showDialog({ anchorPoint: anchorPoint, traversalEdgeBehavior: traversalEdgeBehavior ?? TraversalEdgeBehavior.closedLoop, requestFocus: requestFocus, + animationStyle: animationStyle, ), ); } @@ -1516,6 +1518,7 @@ Future showAdaptiveDialog({ Offset? anchorPoint, TraversalEdgeBehavior? traversalEdgeBehavior, bool? requestFocus, + AnimationStyle? animationStyle, }) { final ThemeData theme = Theme.of(context); switch (theme.platform) { @@ -1535,6 +1538,7 @@ Future showAdaptiveDialog({ anchorPoint: anchorPoint, traversalEdgeBehavior: traversalEdgeBehavior, requestFocus: requestFocus, + animationStyle: animationStyle, ); case TargetPlatform.iOS: case TargetPlatform.macOS: @@ -1628,7 +1632,9 @@ class DialogRoute extends RawDialogRoute { super.requestFocus, super.anchorPoint, super.traversalEdgeBehavior, - }) : super( + AnimationStyle? animationStyle, + }) : _animationStyle = animationStyle, + super( pageBuilder: ( BuildContext buildContext, Animation animation, @@ -1642,16 +1648,21 @@ class DialogRoute extends RawDialogRoute { return dialog; }, barrierLabel: barrierLabel ?? MaterialLocalizations.of(context).modalBarrierDismissLabel, - transitionDuration: const Duration(milliseconds: 150), + transitionDuration: animationStyle?.duration ?? const Duration(milliseconds: 150), transitionBuilder: _buildMaterialDialogTransitions, ); CurvedAnimation? _curvedAnimation; + final AnimationStyle? _animationStyle; void _setAnimation(Animation animation) { if (_curvedAnimation?.parent != animation) { _curvedAnimation?.dispose(); - _curvedAnimation = CurvedAnimation(parent: animation, curve: Curves.easeOut); + _curvedAnimation = CurvedAnimation( + parent: animation, + curve: _animationStyle?.curve ?? Curves.easeOut, + reverseCurve: _animationStyle?.reverseCurve ?? Curves.easeOut, + ); } } diff --git a/packages/flutter/test/material/dialog_test.dart b/packages/flutter/test/material/dialog_test.dart index f01c488b7c..f54ddda37e 100644 --- a/packages/flutter/test/material/dialog_test.dart +++ b/packages/flutter/test/material/dialog_test.dart @@ -2682,6 +2682,39 @@ void main() { expect(find.text('Dialog2'), findsOneWidget); }); + testWidgets('Applies AnimationStyle to showAdaptiveDialog', (WidgetTester tester) async { + const AnimationStyle animationStyle = AnimationStyle( + duration: Duration(seconds: 1), + curve: Curves.easeInOut, + ); + + await tester.pumpWidget( + const MaterialApp( + home: Material(child: Center(child: ElevatedButton(onPressed: null, child: Text('Go')))), + ), + ); + final BuildContext context = tester.element(find.text('Go')); + showAdaptiveDialog( + context: context, + builder: (BuildContext context) { + return Container( + width: 100.0, + height: 100.0, + alignment: Alignment.center, + child: const Text('Dialog1'), + ); + }, + animationStyle: animationStyle, + ); + + await tester.pumpAndSettle(const Duration(seconds: 1)); + expect(find.text('Dialog1'), findsOneWidget); + + await tester.tapAt(const Offset(10.0, 10.0)); + await tester.pumpAndSettle(const Duration(seconds: 1)); + expect(find.text('Dialog1'), findsNothing); + }); + testWidgets('Uses open focus traversal when overridden', (WidgetTester tester) async { final FocusNode okNode = FocusNode(); addTearDown(okNode.dispose);