@@ -446,4 +446,110 @@ void main() {
446
446
expect (_getOpacity (tester, 'Fade In' ), 1.0 );
447
447
});
448
448
});
449
+
450
+ group ('ScaleTransition' , () {
451
+ testWidgets ('uses ImageFilter when provided with FilterQuality argument' , (WidgetTester tester) async {
452
+ final AnimationController controller = AnimationController (vsync: const TestVSync ());
453
+ final Animation <double > animation = Tween <double >(begin: 0.0 , end: 1.0 ).animate (controller);
454
+ final Widget widget = Directionality (
455
+ textDirection: TextDirection .ltr,
456
+ child: ScaleTransition (
457
+ scale: animation,
458
+ filterQuality: FilterQuality .none,
459
+ child: const Text ('Scale Transition' ),
460
+ ),
461
+ );
462
+
463
+ await tester.pumpWidget (widget);
464
+
465
+ // Validate that expensive layer is not left in tree before animation has started.
466
+ expect (tester.layers, isNot (contains (isA <ImageFilterLayer >())));
467
+
468
+ controller.value = 0.25 ;
469
+ await tester.pump ();
470
+
471
+ expect (tester.layers, contains (isA <ImageFilterLayer >().having (
472
+ (ImageFilterLayer layer) => layer.imageFilter.toString (),
473
+ 'image filter' ,
474
+ startsWith ('ImageFilter.matrix(' ),
475
+ )));
476
+
477
+ controller.value = 0.5 ;
478
+ await tester.pump ();
479
+
480
+ expect (tester.layers, contains (isA <ImageFilterLayer >().having (
481
+ (ImageFilterLayer layer) => layer.imageFilter.toString (),
482
+ 'image filter' ,
483
+ startsWith ('ImageFilter.matrix(' ),
484
+ )));
485
+
486
+ controller.value = 0.75 ;
487
+ await tester.pump ();
488
+
489
+ expect (tester.layers, contains (isA <ImageFilterLayer >().having (
490
+ (ImageFilterLayer layer) => layer.imageFilter.toString (),
491
+ 'image filter' ,
492
+ startsWith ('ImageFilter.matrix(' ),
493
+ )));
494
+
495
+ controller.value = 1 ;
496
+ await tester.pump ();
497
+
498
+ // Validate that expensive layer is not left in tree after animation has finished.
499
+ expect (tester.layers, isNot (contains (isA <ImageFilterLayer >())));
500
+ });
501
+ });
502
+
503
+ group ('RotationTransition' , () {
504
+ testWidgets ('uses ImageFilter when provided with FilterQuality argument' , (WidgetTester tester) async {
505
+ final AnimationController controller = AnimationController (vsync: const TestVSync ());
506
+ final Animation <double > animation = Tween <double >(begin: 0.0 , end: 1.0 ).animate (controller);
507
+ final Widget widget = Directionality (
508
+ textDirection: TextDirection .ltr,
509
+ child: RotationTransition (
510
+ turns: animation,
511
+ filterQuality: FilterQuality .none,
512
+ child: const Text ('Scale Transition' ),
513
+ ),
514
+ );
515
+
516
+ await tester.pumpWidget (widget);
517
+
518
+ // Validate that expensive layer is not left in tree before animation has started.
519
+ expect (tester.layers, isNot (contains (isA <ImageFilterLayer >())));
520
+
521
+ controller.value = 0.25 ;
522
+ await tester.pump ();
523
+
524
+ expect (tester.layers, contains (isA <ImageFilterLayer >().having (
525
+ (ImageFilterLayer layer) => layer.imageFilter.toString (),
526
+ 'image filter' ,
527
+ startsWith ('ImageFilter.matrix(' ),
528
+ )));
529
+
530
+ controller.value = 0.5 ;
531
+ await tester.pump ();
532
+
533
+ expect (tester.layers, contains (isA <ImageFilterLayer >().having (
534
+ (ImageFilterLayer layer) => layer.imageFilter.toString (),
535
+ 'image filter' ,
536
+ startsWith ('ImageFilter.matrix(' ),
537
+ )));
538
+
539
+ controller.value = 0.75 ;
540
+ await tester.pump ();
541
+
542
+ expect (tester.layers, contains (isA <ImageFilterLayer >().having (
543
+ (ImageFilterLayer layer) => layer.imageFilter.toString (),
544
+ 'image filter' ,
545
+ startsWith ('ImageFilter.matrix(' ),
546
+ )));
547
+
548
+ controller.value = 1 ;
549
+ await tester.pump ();
550
+
551
+ // Validate that expensive layer is not left in tree after animation has finished.
552
+ expect (tester.layers, isNot (contains (isA <ImageFilterLayer >())));
553
+ });
554
+ });
449
555
}
0 commit comments