Skip to content

Commit 8c6513d

Browse files
Reverts "Support custom transition duration for DialogRoute, CupertinoDialogRoute and show dialog methods. (flutter#154048)" (flutter#154743)
Reverts: flutter#154048 Initiated by: nate-thegrate Reason for reverting: using `AnimationStyle` instead would allow for complete animation duration and curve customization. Original PR Author: nploi Reviewed By: {piedcipher, nate-thegrate} This change reverts the following previous change: Currently we don't support custom transition duration for `DialogRoute`, `CupertinoDialogRoute` and show dialog methods , This PR will to support that.
1 parent 2e221e7 commit 8c6513d

File tree

5 files changed

+9
-415
lines changed

5 files changed

+9
-415
lines changed

packages/flutter/lib/src/cupertino/route.dart

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,6 @@ const Color kCupertinoModalBarrierColor = CupertinoDynamicColor.withBrightness(
5757
// The duration of the transition used when a modal popup is shown.
5858
const Duration _kModalPopupTransitionDuration = Duration(milliseconds: 335);
5959

60-
// The transition duration used for [CupertinoDialogRoute] transitions.
61-
const Duration _kCupertinoDialogRouteTransitionDuration = Duration(milliseconds: 250);
62-
6360
// Offset from offscreen to the right to fully on screen.
6461
final Animatable<Offset> _kRightMiddleTween = Tween<Offset>(
6562
begin: const Offset(1.0, 0.0),
@@ -1272,10 +1269,6 @@ Widget _buildCupertinoDialogTransitions(BuildContext context, Animation<double>
12721269
/// By default, `useRootNavigator` is `true` and the dialog route created by
12731270
/// this method is pushed to the root navigator.
12741271
///
1275-
/// the `transitionDuration` argument is used to specify the duration of
1276-
/// the dialog's entrance and exit animations. If it's not provided or `null`,
1277-
/// then it uses the default value as set by [CupertinoDialogRoute].
1278-
///
12791272
/// {@macro flutter.widgets.RawDialogRoute}
12801273
///
12811274
/// If the application has multiple [Navigator] objects, it may be necessary to
@@ -1320,7 +1313,6 @@ Future<T?> showCupertinoDialog<T>({
13201313
bool barrierDismissible = false,
13211314
RouteSettings? routeSettings,
13221315
Offset? anchorPoint,
1323-
Duration? transitionDuration,
13241316
}) {
13251317

13261318
return Navigator.of(context, rootNavigator: useRootNavigator).push<T>(CupertinoDialogRoute<T>(
@@ -1331,7 +1323,6 @@ Future<T?> showCupertinoDialog<T>({
13311323
barrierColor: CupertinoDynamicColor.resolve(kCupertinoModalBarrierColor, context),
13321324
settings: routeSettings,
13331325
anchorPoint: anchorPoint,
1334-
transitionDuration: transitionDuration,
13351326
));
13361327
}
13371328

@@ -1359,10 +1350,6 @@ Future<T?> showCupertinoDialog<T>({
13591350
/// barrier that darkens everything below the dialog. If `null`, then
13601351
/// [CupertinoDynamicColor.resolve] is used to compute the modal color.
13611352
///
1362-
/// The `transitionDuration` argument is used to specify the duration of
1363-
/// the dialog's entrance and exit animations. If it's not provided or `null`,
1364-
/// then the default duration `Duration(milliseconds: 250)` is used.
1365-
///
13661353
/// The `settings` argument define the settings for this route. See
13671354
/// [RouteSettings] for details.
13681355
///
@@ -1385,7 +1372,7 @@ class CupertinoDialogRoute<T> extends RawDialogRoute<T> {
13851372
Color? barrierColor,
13861373
String? barrierLabel,
13871374
// This transition duration was eyeballed comparing with iOS
1388-
Duration? transitionDuration,
1375+
super.transitionDuration = const Duration(milliseconds: 250),
13891376
this.transitionBuilder,
13901377
super.settings,
13911378
super.requestFocus,
@@ -1397,7 +1384,6 @@ class CupertinoDialogRoute<T> extends RawDialogRoute<T> {
13971384
transitionBuilder: transitionBuilder ?? _buildCupertinoDialogTransitions,
13981385
barrierLabel: barrierLabel ?? CupertinoLocalizations.of(context).modalBarrierDismissLabel,
13991386
barrierColor: barrierColor ?? CupertinoDynamicColor.resolve(kCupertinoModalBarrierColor, context),
1400-
transitionDuration: transitionDuration ?? _kCupertinoDialogRouteTransitionDuration,
14011387
);
14021388

14031389
/// Custom transition builder

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

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,6 @@ import 'theme_data.dart';
3131

3232
const EdgeInsets _defaultInsetPadding = EdgeInsets.symmetric(horizontal: 40.0, vertical: 24.0);
3333

34-
// The transition duration used for [DialogRoute] transitions.
35-
const Duration _kDialogRouteTransitionDuration = Duration(milliseconds: 150);
36-
3734
/// A Material Design dialog.
3835
///
3936
/// This dialog widget does not have any opinion about the contents of the
@@ -1348,10 +1345,6 @@ Widget _buildMaterialDialogTransitions(BuildContext context, Animation<double> a
13481345
/// field from `DialogThemeData` is used. If that is `null` the default color
13491346
/// `Colors.black54` is used.
13501347
///
1351-
/// the `transitionDuration` argument is used to specify the duration of
1352-
/// the dialog's entrance and exit animations. If it's not provided or `null`,
1353-
/// then it uses the default value as set by [DialogRoute].
1354-
///
13551348
/// The `useSafeArea` argument is used to indicate if the dialog should only
13561349
/// display in 'safe' areas of the screen not used by the operating system
13571350
/// (see [SafeArea] for more details). It is `true` by default, which means
@@ -1435,7 +1428,6 @@ Future<T?> showDialog<T>({
14351428
RouteSettings? routeSettings,
14361429
Offset? anchorPoint,
14371430
TraversalEdgeBehavior? traversalEdgeBehavior,
1438-
Duration? transitionDuration,
14391431
}) {
14401432
assert(_debugIsActive(context));
14411433
assert(debugCheckHasMaterialLocalizations(context));
@@ -1462,7 +1454,6 @@ Future<T?> showDialog<T>({
14621454
themes: themes,
14631455
anchorPoint: anchorPoint,
14641456
traversalEdgeBehavior: traversalEdgeBehavior ?? TraversalEdgeBehavior.closedLoop,
1465-
transitionDuration: transitionDuration,
14661457
));
14671458
}
14681459

@@ -1474,10 +1465,6 @@ Future<T?> showDialog<T>({
14741465
///
14751466
/// On Cupertino platforms, [barrierColor], [useSafeArea], and
14761467
/// [traversalEdgeBehavior] are ignored.
1477-
///
1478-
/// The `transitionDuration` argument is used to specify the duration of
1479-
/// the dialog's entrance and exit animations. If it's not provided or `null`,
1480-
/// then it uses the default value as set by [DialogRoute] or [CupertinoDialogRoute].
14811468
Future<T?> showAdaptiveDialog<T>({
14821469
required BuildContext context,
14831470
required WidgetBuilder builder,
@@ -1489,7 +1476,6 @@ Future<T?> showAdaptiveDialog<T>({
14891476
RouteSettings? routeSettings,
14901477
Offset? anchorPoint,
14911478
TraversalEdgeBehavior? traversalEdgeBehavior,
1492-
Duration? transitionDuration,
14931479
}) {
14941480
final ThemeData theme = Theme.of(context);
14951481
switch (theme.platform) {
@@ -1508,7 +1494,6 @@ Future<T?> showAdaptiveDialog<T>({
15081494
routeSettings: routeSettings,
15091495
anchorPoint: anchorPoint,
15101496
traversalEdgeBehavior: traversalEdgeBehavior,
1511-
transitionDuration: transitionDuration,
15121497
);
15131498
case TargetPlatform.iOS:
15141499
case TargetPlatform.macOS:
@@ -1520,7 +1505,6 @@ Future<T?> showAdaptiveDialog<T>({
15201505
useRootNavigator: useRootNavigator,
15211506
anchorPoint: anchorPoint,
15221507
routeSettings: routeSettings,
1523-
transitionDuration: transitionDuration,
15241508
);
15251509
}
15261510
}
@@ -1568,10 +1552,6 @@ bool _debugIsActive(BuildContext context) {
15681552
/// barrier that darkens everything below the dialog. If `null`, the default
15691553
/// color `Colors.black54` is used.
15701554
///
1571-
/// the `transitionDuration` argument is used to specify the duration of
1572-
/// the dialog's entrance and exit animations. If it's not provided or `null`,
1573-
/// then the default duration `Duration(milliseconds: 150)` is used.
1574-
///
15751555
/// The `useSafeArea` argument is used to indicate if the dialog should only
15761556
/// display in 'safe' areas of the screen not used by the operating system
15771557
/// (see [SafeArea] for more details). It is `true` by default, which means
@@ -1602,7 +1582,6 @@ class DialogRoute<T> extends RawDialogRoute<T> {
16021582
super.barrierDismissible,
16031583
String? barrierLabel,
16041584
bool useSafeArea = true,
1605-
Duration? transitionDuration,
16061585
super.settings,
16071586
super.requestFocus,
16081587
super.anchorPoint,
@@ -1617,8 +1596,8 @@ class DialogRoute<T> extends RawDialogRoute<T> {
16171596
return dialog;
16181597
},
16191598
barrierLabel: barrierLabel ?? MaterialLocalizations.of(context).modalBarrierDismissLabel,
1599+
transitionDuration: const Duration(milliseconds: 150),
16201600
transitionBuilder: _buildMaterialDialogTransitions,
1621-
transitionDuration: transitionDuration ?? _kDialogRouteTransitionDuration,
16221601
);
16231602

16241603
CurvedAnimation? _curvedAnimation;

packages/flutter/test/cupertino/route_test.dart

Lines changed: 2 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1883,45 +1883,6 @@ void main() {
18831883
expect(nestedObserver.dialogCount, 0);
18841884
});
18851885

1886-
testWidgets('showCupertinoDialog - custom transitionDuration', (WidgetTester tester) async {
1887-
final DialogObserver rootObserver = DialogObserver();
1888-
final DialogObserver nestedObserver = DialogObserver();
1889-
1890-
await tester.pumpWidget(CupertinoApp(
1891-
navigatorObservers: <NavigatorObserver>[rootObserver],
1892-
home: Navigator(
1893-
observers: <NavigatorObserver>[nestedObserver],
1894-
onGenerateRoute: (RouteSettings settings) {
1895-
return PageRouteBuilder<dynamic>(
1896-
pageBuilder: (BuildContext context, Animation<double> _, Animation<double> __) {
1897-
return GestureDetector(
1898-
onTap: () async {
1899-
await showCupertinoDialog<void>(
1900-
context: context,
1901-
transitionDuration: const Duration(milliseconds: 50),
1902-
builder: (BuildContext context) => const SizedBox(),
1903-
);
1904-
},
1905-
child: const Text('tap'),
1906-
);
1907-
},
1908-
);
1909-
},
1910-
),
1911-
));
1912-
1913-
// Open the dialog.
1914-
await tester.tap(find.text('tap'));
1915-
await tester.pump();
1916-
1917-
expect(rootObserver.dialogCount, 1);
1918-
expect(nestedObserver.dialogCount, 0);
1919-
expect(rootObserver.dialogRoutes.length, equals(1));
1920-
final ModalRoute<dynamic> route = rootObserver.dialogRoutes.last;
1921-
expect(route is CupertinoDialogRoute, true);
1922-
expect(route.transitionDuration.inMilliseconds, 50);
1923-
});
1924-
19251886
testWidgets('showCupertinoDialog uses nested navigator if useRootNavigator is false', (WidgetTester tester) async {
19261887
final DialogObserver rootObserver = DialogObserver();
19271888
final DialogObserver nestedObserver = DialogObserver();
@@ -2971,24 +2932,15 @@ class PopupObserver extends NavigatorObserver {
29712932
}
29722933

29732934
class DialogObserver extends NavigatorObserver {
2974-
final List<ModalRoute<dynamic>> dialogRoutes = <ModalRoute<dynamic>>[];
2975-
int get dialogCount => dialogRoutes.length;
2935+
int dialogCount = 0;
29762936

29772937
@override
29782938
void didPush(Route<dynamic> route, Route<dynamic>? previousRoute) {
29792939
if (route is CupertinoDialogRoute) {
2980-
dialogRoutes.add(route);
2940+
dialogCount++;
29812941
}
29822942
super.didPush(route, previousRoute);
29832943
}
2984-
2985-
@override
2986-
void didPop(Route<dynamic> route, Route<dynamic>? previousRoute) {
2987-
if (route is CupertinoDialogRoute) {
2988-
dialogRoutes.removeLast();
2989-
}
2990-
super.didPop(route, previousRoute);
2991-
}
29922944
}
29932945

29942946
class RouteSettingsObserver extends NavigatorObserver {

packages/flutter/test/material/dialog_test.dart

Lines changed: 2 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -2533,50 +2533,6 @@ void main() {
25332533
expect(currentRouteSetting.name, '/');
25342534
});
25352535

2536-
testWidgets('showDialog - custom transitionDuration', (WidgetTester tester) async {
2537-
final DialogObserver rootObserver = DialogObserver();
2538-
await tester.pumpWidget(
2539-
MaterialApp(
2540-
navigatorObservers: <NavigatorObserver>[rootObserver],
2541-
home: Material(
2542-
child: Builder(
2543-
builder: (BuildContext context) {
2544-
return Center(
2545-
child: ElevatedButton(
2546-
child: const Text('X'),
2547-
onPressed: () {
2548-
showDialog<void>(
2549-
context: context,
2550-
transitionDuration: const Duration(milliseconds: 50),
2551-
builder: (BuildContext context) {
2552-
return const AlertDialog(
2553-
title: Text('Title'),
2554-
content: Text('Y'),
2555-
actions: <Widget>[],
2556-
);
2557-
},
2558-
);
2559-
},
2560-
),
2561-
);
2562-
},
2563-
),
2564-
),
2565-
),
2566-
);
2567-
2568-
await tester.tap(find.text('X'));
2569-
await tester.pump();
2570-
2571-
expect(rootObserver.dialogRoutes.length, equals(1));
2572-
final ModalRoute<dynamic> route = rootObserver.dialogRoutes.last;
2573-
expect(route is DialogRoute, true);
2574-
expect(route.barrierDismissible, isNotNull);
2575-
expect(route.barrierColor, isNotNull);
2576-
expect(route.transitionDuration, isNotNull);
2577-
expect(route.transitionDuration.inMilliseconds, 50);
2578-
});
2579-
25802536
testWidgets('showDialog - custom barrierLabel', (WidgetTester tester) async {
25812537
final SemanticsTester semantics = SemanticsTester(tester);
25822538

@@ -2873,50 +2829,6 @@ void main() {
28732829
expect(find.text('Dialog2'), findsOneWidget);
28742830
});
28752831

2876-
testWidgets('showAdaptiveDialog - custom transitionDuration', (WidgetTester tester) async {
2877-
final DialogObserver rootObserver = DialogObserver();
2878-
await tester.pumpWidget(
2879-
MaterialApp(
2880-
navigatorObservers: <NavigatorObserver>[rootObserver],
2881-
home: Material(
2882-
child: Builder(
2883-
builder: (BuildContext context) {
2884-
return Center(
2885-
child: ElevatedButton(
2886-
child: const Text('X'),
2887-
onPressed: () {
2888-
showAdaptiveDialog<void>(
2889-
context: context,
2890-
transitionDuration: const Duration(milliseconds: 50),
2891-
builder: (BuildContext context) {
2892-
return const AlertDialog(
2893-
title: Text('Title'),
2894-
content: Text('Y'),
2895-
actions: <Widget>[],
2896-
);
2897-
},
2898-
);
2899-
},
2900-
),
2901-
);
2902-
},
2903-
),
2904-
),
2905-
),
2906-
);
2907-
2908-
await tester.tap(find.text('X'));
2909-
await tester.pump();
2910-
2911-
expect(rootObserver.dialogRoutes.length, equals(1));
2912-
final ModalRoute<dynamic> route = rootObserver.dialogRoutes.last;
2913-
expect(route is DialogRoute, true);
2914-
expect(route.barrierDismissible, isNotNull);
2915-
expect(route.barrierColor, isNotNull);
2916-
expect(route.transitionDuration, isNotNull);
2917-
expect(route.transitionDuration.inMilliseconds, 50);
2918-
});
2919-
29202832
testWidgets('Uses open focus traversal when overridden', (WidgetTester tester) async {
29212833
final FocusNode okNode = FocusNode();
29222834
addTearDown(okNode.dispose);
@@ -3090,24 +3002,15 @@ class _RestorableDialogTestWidget extends StatelessWidget {
30903002
}
30913003

30923004
class DialogObserver extends NavigatorObserver {
3093-
final List<ModalRoute<dynamic>> dialogRoutes = <ModalRoute<dynamic>>[];
3094-
int get dialogCount => dialogRoutes.length;
3005+
int dialogCount = 0;
30953006

30963007
@override
30973008
void didPush(Route<dynamic> route, Route<dynamic>? previousRoute) {
30983009
if (route is DialogRoute) {
3099-
dialogRoutes.add(route);
3010+
dialogCount++;
31003011
}
31013012
super.didPush(route, previousRoute);
31023013
}
3103-
3104-
@override
3105-
void didPop(Route<dynamic> route, Route<dynamic>? previousRoute) {
3106-
if (route is DialogRoute) {
3107-
dialogRoutes.removeLast();
3108-
}
3109-
super.didPop(route, previousRoute);
3110-
}
31113014
}
31123015

31133016
class _ClosureNavigatorObserver extends NavigatorObserver {

0 commit comments

Comments
 (0)