From 2be5084b26414c283526c5c00b43c1e9cf317fa6 Mon Sep 17 00:00:00 2001 From: Mitchell Goodwin <58190796+MitchellGoodwin@users.noreply.github.com> Date: Fri, 8 Mar 2024 11:00:16 -0800 Subject: [PATCH] Fixes the transition builder changing the Cupertino transition on Android. (#134790) Fixes #124850. Changes the fallback for the builder on Android. Before the error was from the platform being changed mid Cupertino transition to iOS. If a default builder wasn't set for iOS (which a developer developing only for Android might not), then it defaulted to the Zoom transition. Which changing the transition while on the fly caused issues. --- .../src/material/page_transitions_theme.dart | 6 +- .../material/page_transitions_theme_test.dart | 80 +++++++++++++++++++ 2 files changed, 84 insertions(+), 2 deletions(-) diff --git a/packages/flutter/lib/src/material/page_transitions_theme.dart b/packages/flutter/lib/src/material/page_transitions_theme.dart index d7b1b89a231..6b6a0b6d0ff 100644 --- a/packages/flutter/lib/src/material/page_transitions_theme.dart +++ b/packages/flutter/lib/src/material/page_transitions_theme.dart @@ -771,8 +771,10 @@ class PageTransitionsTheme with Diagnosticable { platform = TargetPlatform.iOS; } - final PageTransitionsBuilder matchingBuilder = - builders[platform] ?? const ZoomPageTransitionsBuilder(); + final PageTransitionsBuilder matchingBuilder = builders[platform] ?? switch (platform) { + TargetPlatform.iOS => const CupertinoPageTransitionsBuilder(), + TargetPlatform.android || TargetPlatform.fuchsia || TargetPlatform.windows || TargetPlatform.macOS || TargetPlatform.linux => const ZoomPageTransitionsBuilder(), + }; return matchingBuilder.buildTransitions(route, context, animation, secondaryAnimation, child); } diff --git a/packages/flutter/test/material/page_transitions_theme_test.dart b/packages/flutter/test/material/page_transitions_theme_test.dart index 323d4ed0c03..43349808094 100644 --- a/packages/flutter/test/material/page_transitions_theme_test.dart +++ b/packages/flutter/test/material/page_transitions_theme_test.dart @@ -134,6 +134,86 @@ void main() { expect(findOpenUpwardsPageTransition(), findsOneWidget); }, variant: TargetPlatformVariant.only(TargetPlatform.android)); + testWidgets('PageTransitionsTheme override builds a CupertinoPageTransition on android', (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.android: CupertinoPageTransitionsBuilder(), + }, + ), + ), + routes: routes, + ), + ); + + expect(Theme.of(tester.element(find.text('push'))).platform, debugDefaultTargetPlatformOverride); + expect(find.byType(CupertinoPageTransition), findsOneWidget); + + await tester.tap(find.text('push')); + await tester.pumpAndSettle(); + expect(find.text('page b'), findsOneWidget); + expect(find.byType(CupertinoPageTransition), findsOneWidget); + }, variant: TargetPlatformVariant.only(TargetPlatform.android)); + + testWidgets('CupertinoPageTransition on android does not block gestures on backswipe', (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.android: CupertinoPageTransitionsBuilder(), + }, + ), + ), + routes: routes, + ), + ); + + expect(Theme.of(tester.element(find.text('push'))).platform, debugDefaultTargetPlatformOverride); + expect(find.byType(CupertinoPageTransition), findsOneWidget); + + await tester.tap(find.text('push')); + await tester.pumpAndSettle(); + expect(find.text('page b'), findsOneWidget); + expect(find.byType(CupertinoPageTransition), findsOneWidget); + + await tester.pumpAndSettle(const Duration(minutes: 1)); + + final TestGesture gesture = await tester.startGesture(const Offset(5.0, 100.0)); + await gesture.moveBy(const Offset(400.0, 0.0)); + await gesture.up(); + await tester.pump(); + + await tester.pumpAndSettle(const Duration(minutes: 1)); + + expect(find.text('push'), findsOneWidget); + await tester.tap(find.text('push')); + await tester.pumpAndSettle(); + expect(find.text('page b'), findsOneWidget); + }, variant: TargetPlatformVariant.only(TargetPlatform.android)); + testWidgets('PageTransitionsTheme override builds a _FadeUpwardsTransition', (WidgetTester tester) async { final Map routes = { '/': (BuildContext context) => Material(