@@ -291,6 +291,7 @@ class _ZoomEnterTransitionState extends State<_ZoomEnterTransition> with _ZoomTr
291291 bool get useSnapshot => ! kIsWeb && widget.allowSnapshotting;
292292
293293 late _ZoomEnterTransitionPainter delegate;
294+ MediaQueryData ? mediaQueryData;
294295
295296 static final Animatable <double > _fadeInTransition = Tween <double >(
296297 begin: 0.0 ,
@@ -355,6 +356,18 @@ class _ZoomEnterTransitionState extends State<_ZoomEnterTransition> with _ZoomTr
355356 super .didUpdateWidget (oldWidget);
356357 }
357358
359+ @override
360+ void didChangeDependencies () {
361+ // If the screen size changes during the transition, perhaps due to
362+ // a keyboard dismissal, then ensure that contents are re-rasterized once.
363+ final MediaQueryData ? data = MediaQuery .maybeOf (context);
364+ if (mediaQueryDataChanged (mediaQueryData, data)) {
365+ controller.clear ();
366+ }
367+ mediaQueryData = data;
368+ super .didChangeDependencies ();
369+ }
370+
358371 @override
359372 void dispose () {
360373 widget.animation.removeListener (onAnimationValueChange);
@@ -394,6 +407,7 @@ class _ZoomExitTransition extends StatefulWidget {
394407
395408class _ZoomExitTransitionState extends State <_ZoomExitTransition > with _ZoomTransitionBase {
396409 late _ZoomExitTransitionPainter delegate;
410+ MediaQueryData ? mediaQueryData;
397411
398412 // See SnapshotWidget doc comment, this is disabled on web because the HTML backend doesn't
399413 // support this functionality and the canvaskit backend uses a single thread for UI and raster
@@ -458,6 +472,18 @@ class _ZoomExitTransitionState extends State<_ZoomExitTransition> with _ZoomTran
458472 super .didUpdateWidget (oldWidget);
459473 }
460474
475+ @override
476+ void didChangeDependencies () {
477+ // If the screen size changes during the transition, perhaps due to
478+ // a keyboard dismissal, then ensure that contents are re-rasterized once.
479+ final MediaQueryData ? data = MediaQuery .maybeOf (context);
480+ if (mediaQueryDataChanged (mediaQueryData, data)) {
481+ controller.clear ();
482+ }
483+ mediaQueryData = data;
484+ super .didChangeDependencies ();
485+ }
486+
461487 @override
462488 void dispose () {
463489 widget.animation.removeListener (onAnimationValueChange);
@@ -804,6 +830,13 @@ mixin _ZoomTransitionBase {
804830 break ;
805831 }
806832 }
833+
834+ // Whether any of the properties that would impact the page transition
835+ // changed.
836+ bool mediaQueryDataChanged (MediaQueryData ? oldData, MediaQueryData ? newData) {
837+ return oldData? .size != newData? .size ||
838+ oldData? .viewInsets != newData? .viewInsets;
839+ }
807840}
808841
809842class _ZoomEnterTransitionPainter extends SnapshotPainter {
0 commit comments