Match CupertinoPageTransitionsBuilder animation duration to CupertinoPageRoute (#160241)

<!--
Thanks for filing a pull request!
Reviewers are typically assigned within a week of filing a request.
To learn more about code review, see our documentation on Tree Hygiene:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md
-->

The recent changes have made it possible to customize the duration in
PageTransitionsBuilder, so I have adjusted
CupertinoPageTransitionsBuilder's transition duration to
CupertinoPageRoute.

related issue: #29068

| Before | After | Native |
| --- | --- | --- |
| <video
src="https://github.com/user-attachments/assets/1420bb86-37d2-4d5a-b0f9-e0860e3c8f01">
| <video
src="https://github.com/user-attachments/assets/f0455f3a-ca80-4cb6-a803-b9c48ec2075e">
| <video
src="https://github.com/user-attachments/assets/74218f9d-f4a1-4008-84ac-caf73355f467">
|

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.

If you need help, consider asking for advice on the #hackers-new channel
on [Discord].

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[Tree Hygiene]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md
[test-exempt]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests
[Flutter Style Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md
[Features we expect every widget to implement]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement
[CLA]: https://cla.developers.google.com/
[flutter/tests]: https://github.com/flutter/tests
[breaking change policy]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes
[Discord]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md
[Data Driven Fixes]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
This commit is contained in:
Chikamatsu Kazuya 2025-01-14 04:11:59 +09:00 committed by GitHub
parent 27f8bb91a6
commit 5bd65c434a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 53 additions and 4 deletions

View File

@ -148,9 +148,13 @@ mixin CupertinoRouteTransitionMixin<T> on PageRoute<T> {
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;

View File

@ -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;

View File

@ -286,6 +286,48 @@ void main() {
variant: TargetPlatformVariant.only(TargetPlatform.android),
);
testWidgets(
'CupertinoPageTransitionsBuilder default duration is 500ms',
(WidgetTester tester) async {
final Map<String, WidgetBuilder> routes = <String, WidgetBuilder>{
'/':
(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, PageTransitionsBuilder>{
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 {

View File

@ -1975,7 +1975,7 @@ Future<void> 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<void> 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);