Skip to content

Commit 9984ebb

Browse files
author
Jonah Williams
authored
[framework] use ImageFilter for zoom page transition (#101786)
1 parent 9124287 commit 9984ebb

2 files changed

Lines changed: 68 additions & 2 deletions

File tree

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

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,11 @@ class _ZoomEnterTransition extends StatelessWidget {
325325
},
326326
child: FadeTransition(
327327
opacity: fadeTransition,
328-
child: ScaleTransition(scale: scaleTransition, child: child),
328+
child: ScaleTransition(
329+
scale: scaleTransition,
330+
filterQuality: FilterQuality.none,
331+
child: child,
332+
),
329333
),
330334
);
331335
}
@@ -372,7 +376,11 @@ class _ZoomExitTransition extends StatelessWidget {
372376

373377
return FadeTransition(
374378
opacity: fadeTransition,
375-
child: ScaleTransition(scale: scaleTransition, child: child),
379+
child: ScaleTransition(
380+
scale: scaleTransition,
381+
filterQuality: FilterQuality.none,
382+
child: child,
383+
),
376384
);
377385
}
378386
}

packages/flutter/test/material/page_transitions_theme_test.dart

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import 'package:flutter/cupertino.dart';
66
import 'package:flutter/foundation.dart';
77
import 'package:flutter/material.dart';
8+
import 'package:flutter/rendering.dart';
89
import 'package:flutter_test/flutter_test.dart';
910

1011
void main() {
@@ -220,4 +221,61 @@ void main() {
220221
await tester.pumpAndSettle();
221222
expect(builtCount, 1);
222223
}, variant: TargetPlatformVariant.only(TargetPlatform.android));
224+
225+
testWidgets('_ZoomPageTransition uses a FilterQuality while animating', (WidgetTester tester) async {
226+
final Map<String, WidgetBuilder> routes = <String, WidgetBuilder>{
227+
'/': (BuildContext context) => Material(
228+
child: TextButton(
229+
child: const Text('push'),
230+
onPressed: () { Navigator.of(context).pushNamed('/b'); },
231+
),
232+
),
233+
'/b': (BuildContext context) => StatefulBuilder(
234+
builder: (BuildContext context, StateSetter setState) {
235+
return TextButton(
236+
child: const Text('pop'),
237+
onPressed: () { Navigator.pop(context); },
238+
);
239+
},
240+
),
241+
};
242+
243+
await tester.pumpWidget(
244+
MaterialApp(
245+
theme: ThemeData(
246+
pageTransitionsTheme: const PageTransitionsTheme(
247+
builders: <TargetPlatform, PageTransitionsBuilder>{
248+
TargetPlatform.android: ZoomPageTransitionsBuilder(), // creates a _ZoomPageTransition
249+
},
250+
),
251+
),
252+
routes: routes,
253+
),
254+
);
255+
256+
expect(tester.layers, isNot(contains(isA<ImageFilterLayer>())));
257+
258+
await tester.tap(find.text('push'));
259+
await tester.pump();
260+
await tester.pump();
261+
262+
expect(tester.layers, contains(isA<ImageFilterLayer>()));
263+
expect(tester.layers.whereType<ImageFilterLayer>(), hasLength(1));
264+
265+
await tester.pumpAndSettle();
266+
267+
expect(tester.layers, isNot(contains(isA<ImageFilterLayer>())));
268+
269+
await tester.tap(find.text('pop'));
270+
await tester.pump();
271+
await tester.pump();
272+
273+
expect(tester.layers, contains(isA<ImageFilterLayer>()));
274+
// exiting requires two different zooms.
275+
expect(tester.layers.whereType<ImageFilterLayer>(), hasLength(2));
276+
277+
await tester.pumpAndSettle();
278+
279+
expect(tester.layers, isNot(contains(isA<ImageFilterLayer>())));
280+
}, variant: TargetPlatformVariant.only(TargetPlatform.android));
223281
}

0 commit comments

Comments
 (0)