diff --git a/packages/flutter/lib/src/material/page_transitions_theme.dart b/packages/flutter/lib/src/material/page_transitions_theme.dart index 39e81d95fe..4c56f11305 100644 --- a/packages/flutter/lib/src/material/page_transitions_theme.dart +++ b/packages/flutter/lib/src/material/page_transitions_theme.dart @@ -325,7 +325,11 @@ class _ZoomEnterTransition extends StatelessWidget { }, child: FadeTransition( opacity: fadeTransition, - child: ScaleTransition(scale: scaleTransition, child: child), + child: ScaleTransition( + scale: scaleTransition, + filterQuality: FilterQuality.none, + child: child, + ), ), ); } @@ -372,7 +376,11 @@ class _ZoomExitTransition extends StatelessWidget { return FadeTransition( opacity: fadeTransition, - child: ScaleTransition(scale: scaleTransition, child: child), + child: ScaleTransition( + scale: scaleTransition, + filterQuality: FilterQuality.none, + child: child, + ), ); } } diff --git a/packages/flutter/test/material/page_transitions_theme_test.dart b/packages/flutter/test/material/page_transitions_theme_test.dart index 749588c6f5..4899c835aa 100644 --- a/packages/flutter/test/material/page_transitions_theme_test.dart +++ b/packages/flutter/test/material/page_transitions_theme_test.dart @@ -5,6 +5,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { @@ -220,4 +221,61 @@ void main() { await tester.pumpAndSettle(); expect(builtCount, 1); }, variant: TargetPlatformVariant.only(TargetPlatform.android)); + + testWidgets('_ZoomPageTransition uses a FilterQuality while animating', (WidgetTester tester) async { + final Map routes = { + '/': (BuildContext context) => Material( + child: TextButton( + child: const Text('push'), + onPressed: () { Navigator.of(context).pushNamed('/b'); }, + ), + ), + '/b': (BuildContext context) => StatefulBuilder( + builder: (BuildContext context, StateSetter setState) { + return TextButton( + child: const Text('pop'), + onPressed: () { Navigator.pop(context); }, + ); + }, + ), + }; + + await tester.pumpWidget( + MaterialApp( + theme: ThemeData( + pageTransitionsTheme: const PageTransitionsTheme( + builders: { + TargetPlatform.android: ZoomPageTransitionsBuilder(), // creates a _ZoomPageTransition + }, + ), + ), + routes: routes, + ), + ); + + expect(tester.layers, isNot(contains(isA()))); + + await tester.tap(find.text('push')); + await tester.pump(); + await tester.pump(); + + expect(tester.layers, contains(isA())); + expect(tester.layers.whereType(), hasLength(1)); + + await tester.pumpAndSettle(); + + expect(tester.layers, isNot(contains(isA()))); + + await tester.tap(find.text('pop')); + await tester.pump(); + await tester.pump(); + + expect(tester.layers, contains(isA())); + // exiting requires two different zooms. + expect(tester.layers.whereType(), hasLength(2)); + + await tester.pumpAndSettle(); + + expect(tester.layers, isNot(contains(isA()))); + }, variant: TargetPlatformVariant.only(TargetPlatform.android)); }