diff --git a/packages/flutter/lib/src/cupertino/route.dart b/packages/flutter/lib/src/cupertino/route.dart index f0c37a036e5..0206f7604c4 100644 --- a/packages/flutter/lib/src/cupertino/route.dart +++ b/packages/flutter/lib/src/cupertino/route.dart @@ -148,9 +148,13 @@ mixin CupertinoRouteTransitionMixin on PageRoute { super.didChangePrevious(previousRoute); } + /// The duration of the page transition. + /// + /// A relatively rigorous eyeball estimation. + static const Duration kTransitionDuration = Duration(milliseconds: 500); + @override - // A relatively rigorous eyeball estimation. - Duration get transitionDuration => const Duration(milliseconds: 500); + Duration get transitionDuration => kTransitionDuration; @override Color? get barrierColor => fullscreenDialog ? null : _kCupertinoPageTransitionBarrierColor; diff --git a/packages/flutter/lib/src/material/page_transitions_theme.dart b/packages/flutter/lib/src/material/page_transitions_theme.dart index d8d4fc9570a..b6e5b71679c 100644 --- a/packages/flutter/lib/src/material/page_transitions_theme.dart +++ b/packages/flutter/lib/src/material/page_transitions_theme.dart @@ -1019,6 +1019,9 @@ class CupertinoPageTransitionsBuilder extends PageTransitionsBuilder { /// Constructs a page transition animation that matches the iOS transition. const CupertinoPageTransitionsBuilder(); + @override + Duration get transitionDuration => CupertinoRouteTransitionMixin.kTransitionDuration; + @override DelegatedTransitionBuilder? get delegatedTransition => CupertinoPageTransition.delegatedTransition; diff --git a/packages/flutter/test/material/page_transitions_theme_test.dart b/packages/flutter/test/material/page_transitions_theme_test.dart index 9dfff0ac479..1a5cebb28c7 100644 --- a/packages/flutter/test/material/page_transitions_theme_test.dart +++ b/packages/flutter/test/material/page_transitions_theme_test.dart @@ -286,6 +286,48 @@ void main() { variant: TargetPlatformVariant.only(TargetPlatform.android), ); + testWidgets( + 'CupertinoPageTransitionsBuilder default duration is 500ms', + (WidgetTester tester) async { + final Map routes = { + '/': + (BuildContext context) => Material( + child: TextButton( + child: const Text('push'), + onPressed: () { + Navigator.of(context).pushNamed('/b'); + }, + ), + ), + '/b': (BuildContext context) => const Text('page b'), + }; + + await tester.pumpWidget( + MaterialApp( + theme: ThemeData( + pageTransitionsTheme: const PageTransitionsTheme( + builders: { + TargetPlatform.iOS: CupertinoPageTransitionsBuilder(), + }, + ), + ), + routes: routes, + ), + ); + + expect(find.byType(CupertinoPageTransition), findsOneWidget); + + await tester.tap(find.text('push')); + await tester.pump(); + await tester.pump(const Duration(milliseconds: 499)); + expect(tester.hasRunningAnimations, isTrue); + + await tester.pump(const Duration(milliseconds: 10)); + expect(tester.hasRunningAnimations, isFalse); + }, + variant: TargetPlatformVariant.only(TargetPlatform.iOS), + ); + testWidgets( 'Animation duration changes accordingly when page transition builder changes', (WidgetTester tester) async { diff --git a/packages/flutter/test/widgets/heroes_test.dart b/packages/flutter/test/widgets/heroes_test.dart index 491b3ec1ca5..c2e4f968793 100644 --- a/packages/flutter/test/widgets/heroes_test.dart +++ b/packages/flutter/test/widgets/heroes_test.dart @@ -1975,7 +1975,7 @@ Future main() async { await tester.tap(find.text('two')); await tester.pump(); - await tester.pump(const Duration(milliseconds: 500)); + await tester.pump(const Duration(milliseconds: 501)); expect(find.byKey(firstKey), findsNothing); expect(find.byKey(secondKey), isOnstage); @@ -2016,7 +2016,7 @@ Future main() async { await tester.tap(find.text('two')); await tester.pump(); - await tester.pump(const Duration(milliseconds: 500)); + await tester.pump(const Duration(milliseconds: 501)); expect(find.byKey(firstKey), findsNothing); expect(find.byKey(secondKey), isOnstage);