diff --git a/packages/flutter/lib/src/cupertino/route.dart b/packages/flutter/lib/src/cupertino/route.dart
index 0d268c2..1968f40 100644
--- a/packages/flutter/lib/src/cupertino/route.dart
+++ b/packages/flutter/lib/src/cupertino/route.dart
@@ -235,9 +235,6 @@
     return result;
   }
 
-  @override
-  bool get ignorePointerDuringTransitions => true;
-
   // Called by _CupertinoBackGestureDetector when a pop ("back") drag start
   // gesture is detected. The returned controller handles all of the subsequent
   // drag events.
@@ -1052,9 +1049,6 @@
   @override
   Duration get transitionDuration => _kModalPopupTransitionDuration;
 
-  @override
-  bool get ignorePointerDuringTransitions => true;
-
   Animation<double>? _animation;
 
   late Tween<Offset> _offsetTween;
@@ -1355,7 +1349,4 @@
         barrierLabel: barrierLabel ?? CupertinoLocalizations.of(context).modalBarrierDismissLabel,
         barrierColor: barrierColor ?? CupertinoDynamicColor.resolve(kCupertinoModalBarrierColor, context),
       );
-
-  @override
-  bool get ignorePointerDuringTransitions => true;
 }
diff --git a/packages/flutter/lib/src/widgets/routes.dart b/packages/flutter/lib/src/widgets/routes.dart
index 4ebce88..83bcdce 100644
--- a/packages/flutter/lib/src/widgets/routes.dart
+++ b/packages/flutter/lib/src/widgets/routes.dart
@@ -293,85 +293,73 @@
     final VoidCallback? previousTrainHoppingListenerRemover = _trainHoppingListenerRemover;
     _trainHoppingListenerRemover = null;
 
-    if (nextRoute is TransitionRoute<dynamic>) {
-      if (canTransitionTo(nextRoute) && nextRoute.canTransitionFrom(this)) {
-        final Animation<double>? current = _secondaryAnimation.parent;
-        if (current != null) {
-          final Animation<double> currentTrain = (current is TrainHoppingAnimation ? current.currentTrain : current)!;
-          final Animation<double> nextTrain = nextRoute._animation!;
-          if (
-            currentTrain.value == nextTrain.value ||
-                nextTrain.status == AnimationStatus.completed ||
-                nextTrain.status == AnimationStatus.dismissed
-          ) {
-            _setSecondaryAnimation(nextTrain, nextRoute.completed);
-          } else {
-            // Two trains animate at different values. We have to do train hopping.
-            // There are three possibilities of train hopping:
-            //  1. We hop on the nextTrain when two trains meet in the middle using
-            //     TrainHoppingAnimation.
-            //  2. There is no chance to hop on nextTrain because two trains never
-            //     cross each other. We have to directly set the animation to
-            //     nextTrain once the nextTrain stops animating.
-            //  3. A new _updateSecondaryAnimation is called before train hopping
-            //     finishes. We leave a listener remover for the next call to
-            //     properly clean up the existing train hopping.
-            TrainHoppingAnimation? newAnimation;
-            void jumpOnAnimationEnd(AnimationStatus status) {
-              switch (status) {
-                case AnimationStatus.completed:
-                case AnimationStatus.dismissed:
-                  // The nextTrain has stopped animating without train hopping.
-                  // Directly sets the secondary animation and disposes the
-                  // TrainHoppingAnimation.
-                  _setSecondaryAnimation(nextTrain, nextRoute.completed);
-                  if (_trainHoppingListenerRemover != null) {
-                    _trainHoppingListenerRemover!();
-                    _trainHoppingListenerRemover = null;
-                  }
-                  break;
-                case AnimationStatus.forward:
-                case AnimationStatus.reverse:
-                  break;
-              }
-            }
-            _trainHoppingListenerRemover = () {
-              nextTrain.removeStatusListener(jumpOnAnimationEnd);
-              newAnimation?.dispose();
-            };
-            nextTrain.addStatusListener(jumpOnAnimationEnd);
-            newAnimation = TrainHoppingAnimation(
-              currentTrain,
-              nextTrain,
-              onSwitchedTrain: () {
-                assert(_secondaryAnimation.parent == newAnimation);
-                assert(newAnimation!.currentTrain == nextRoute._animation);
-                // We can hop on the nextTrain, so we don't need to listen to
-                // whether the nextTrain has stopped.
-                _setSecondaryAnimation(newAnimation!.currentTrain, nextRoute.completed);
+    if (nextRoute is TransitionRoute<dynamic> && canTransitionTo(nextRoute) && nextRoute.canTransitionFrom(this)) {
+      final Animation<double>? current = _secondaryAnimation.parent;
+      if (current != null) {
+        final Animation<double> currentTrain = (current is TrainHoppingAnimation ? current.currentTrain : current)!;
+        final Animation<double> nextTrain = nextRoute._animation!;
+        if (
+          currentTrain.value == nextTrain.value ||
+          nextTrain.status == AnimationStatus.completed ||
+          nextTrain.status == AnimationStatus.dismissed
+        ) {
+          _setSecondaryAnimation(nextTrain, nextRoute.completed);
+        } else {
+          // Two trains animate at different values. We have to do train hopping.
+          // There are three possibilities of train hopping:
+          //  1. We hop on the nextTrain when two trains meet in the middle using
+          //     TrainHoppingAnimation.
+          //  2. There is no chance to hop on nextTrain because two trains never
+          //     cross each other. We have to directly set the animation to
+          //     nextTrain once the nextTrain stops animating.
+          //  3. A new _updateSecondaryAnimation is called before train hopping
+          //     finishes. We leave a listener remover for the next call to
+          //     properly clean up the existing train hopping.
+          TrainHoppingAnimation? newAnimation;
+          void jumpOnAnimationEnd(AnimationStatus status) {
+            switch (status) {
+              case AnimationStatus.completed:
+              case AnimationStatus.dismissed:
+                // The nextTrain has stopped animating without train hopping.
+                // Directly sets the secondary animation and disposes the
+                // TrainHoppingAnimation.
+                _setSecondaryAnimation(nextTrain, nextRoute.completed);
                 if (_trainHoppingListenerRemover != null) {
                   _trainHoppingListenerRemover!();
                   _trainHoppingListenerRemover = null;
                 }
-              },
-            );
-            _setSecondaryAnimation(newAnimation, nextRoute.completed);
+                break;
+              case AnimationStatus.forward:
+              case AnimationStatus.reverse:
+                break;
+            }
           }
-        } else { // This route has no secondary animation.
-          _setSecondaryAnimation(nextRoute._animation, nextRoute.completed);
+          _trainHoppingListenerRemover = () {
+            nextTrain.removeStatusListener(jumpOnAnimationEnd);
+            newAnimation?.dispose();
+          };
+          nextTrain.addStatusListener(jumpOnAnimationEnd);
+          newAnimation = TrainHoppingAnimation(
+            currentTrain,
+            nextTrain,
+            onSwitchedTrain: () {
+              assert(_secondaryAnimation.parent == newAnimation);
+              assert(newAnimation!.currentTrain == nextRoute._animation);
+              // We can hop on the nextTrain, so we don't need to listen to
+              // whether the nextTrain has stopped.
+              _setSecondaryAnimation(newAnimation!.currentTrain, nextRoute.completed);
+              if (_trainHoppingListenerRemover != null) {
+                _trainHoppingListenerRemover!();
+                _trainHoppingListenerRemover = null;
+              }
+            },
+          );
+          _setSecondaryAnimation(newAnimation, nextRoute.completed);
         }
       } else {
-        // This route cannot coordinate transitions with nextRoute, so it should
-        // have no visible secondary animation. By using an AnimationMin, the
-        // animation's value will always be zero, but it will have nextRoute.animation's
-        // status until it finishes, allowing this route to wait until all visible
-        // transitions are complete to stop ignoring pointers.
-        _setSecondaryAnimation(
-          AnimationMin<double>(kAlwaysDismissedAnimation, nextRoute._animation!),
-          nextRoute.completed,
-        );
+        _setSecondaryAnimation(nextRoute._animation, nextRoute.completed);
       }
-    } else { // The next route is not a TransitionRoute.
+    } else {
       _setSecondaryAnimation(kAlwaysDismissedAnimation);
     }
     // Finally, we dispose any previous train hopping animation because it
@@ -408,9 +396,9 @@
   /// the [nextRoute] is popped off of this route, the
   /// `secondaryAnimation` will run from 1.0 - 0.0.
   ///
-  /// If false, this route's [ModalRoute.buildTransitions] `secondaryAnimation`
-  /// will proxy an animation with a constant value of 0. In other words, this
-  /// route will not animate when [nextRoute] is pushed on top of it or when
+  /// If false, this route's [ModalRoute.buildTransitions] `secondaryAnimation` parameter
+  /// value will be [kAlwaysDismissedAnimation]. In other words, this route
+  /// will not animate when [nextRoute] is pushed on top of it or when
   /// [nextRoute] is popped off of it.
   ///
   /// Returns true by default.
@@ -858,19 +846,17 @@
                                 context,
                                 widget.route.animation!,
                                 widget.route.secondaryAnimation!,
-                                // _listenable updates when this route's animations change
-                                // values, but the _ignorePointerNotifier can also update
-                                // when the status of animations on popping routes change,
-                                // even when this route's animations' values don't. Also,
-                                // when the value of the _ignorePointerNotifier changes,
-                                // it's only necessary to rebuild the IgnorePointer
-                                // widget and set the focus node's ability to focus.
+                                // This additional AnimatedBuilder is include because if the
+                                // value of the userGestureInProgressNotifier changes, it's
+                                // only necessary to rebuild the IgnorePointer widget and set
+                                // the focus node's ability to focus.
                                 AnimatedBuilder(
-                                  animation: widget.route._ignorePointerNotifier,
+                                  animation: widget.route.navigator?.userGestureInProgressNotifier ?? ValueNotifier<bool>(false),
                                   builder: (BuildContext context, Widget? child) {
-                                    focusScopeNode.canRequestFocus = !_shouldIgnoreFocusRequest;
+                                    final bool ignoreEvents = _shouldIgnoreFocusRequest;
+                                    focusScopeNode.canRequestFocus = !ignoreEvents;
                                     return IgnorePointer(
-                                      ignoring: widget.route._ignorePointer,
+                                      ignoring: ignoreEvents,
                                       child: child,
                                     );
                                   },
@@ -1154,36 +1140,11 @@
     return child;
   }
 
-  /// Whether this route should ignore pointers when transitions are in progress.
-  ///
-  /// Pointers always are ignored when [isCurrent] is false (e.g., when a route
-  /// has a new route pushed on top of it, or during a route's exit transition
-  /// after popping). Override this value to also ignore pointers on pages during
-  /// transitions where this route is the current route (e.g., after the route
-  /// above this route pops, or during this route's entrance transition).
-  ///
-  /// Returns false by default.
-  ///
-  /// See also:
-  ///
-  ///  * [CupertinoRouteTransitionMixin], [CupertinoModalPopupRoute], and
-  ///    [CupertinoDialogRoute], which use this property to specify that
-  ///    Cupertino routes ignore pointers during transitions.
-  @protected
-  bool get ignorePointerDuringTransitions => false;
-
   @override
   void install() {
     super.install();
-    _animationProxy = ProxyAnimation(super.animation)
-      ..addStatusListener(_handleAnimationStatusChanged);
-    _secondaryAnimationProxy = ProxyAnimation(super.secondaryAnimation)
-      ..addStatusListener(_handleAnimationStatusChanged);
-    navigator!.userGestureInProgressNotifier.addListener(_maybeUpdateIgnorePointer);
-  }
-
-  void _handleAnimationStatusChanged(AnimationStatus status) {
-    _maybeUpdateIgnorePointer();
+    _animationProxy = ProxyAnimation(super.animation);
+    _secondaryAnimationProxy = ProxyAnimation(super.secondaryAnimation);
   }
 
   @override
@@ -1419,19 +1380,6 @@
   Animation<double>? get secondaryAnimation => _secondaryAnimationProxy;
   ProxyAnimation? _secondaryAnimationProxy;
 
-  bool get _ignorePointer => _ignorePointerNotifier.value;
-  final ValueNotifier<bool> _ignorePointerNotifier = ValueNotifier<bool>(false);
-
-  void _maybeUpdateIgnorePointer() {
-    bool isTransitioning(Animation<double>? animation) {
-      return animation?.status == AnimationStatus.forward || animation?.status == AnimationStatus.reverse;
-    }
-    _ignorePointerNotifier.value = !isCurrent ||
-        (navigator?.userGestureInProgress ?? false) ||
-        (ignorePointerDuringTransitions &&
-            (isTransitioning(animation) || isTransitioning(secondaryAnimation)));
-  }
-
   final List<WillPopCallback> _willPopCallbacks = <WillPopCallback>[];
 
   /// Returns [RoutePopDisposition.doNotPop] if any of callbacks added with
@@ -1650,14 +1598,9 @@
         child: barrier,
       );
     }
-    barrier = AnimatedBuilder(
-      animation: _ignorePointerNotifier,
-      builder: (BuildContext context, Widget? child) {
-        return IgnorePointer(
-          ignoring: _ignorePointer,
-          child: child,
-        );
-      },
+    barrier = IgnorePointer(
+      ignoring: animation!.status == AnimationStatus.reverse || // changedInternalState is called when animation.status updates
+                animation!.status == AnimationStatus.dismissed, // dismissed is possible when doing a manual pop gesture
       child: barrier,
     );
     if (semanticsDismissible && barrierDismissible) {
diff --git a/packages/flutter/test/cupertino/action_sheet_test.dart b/packages/flutter/test/cupertino/action_sheet_test.dart
index c9b6aa0..1b849c9 100644
--- a/packages/flutter/test/cupertino/action_sheet_test.dart
+++ b/packages/flutter/test/cupertino/action_sheet_test.dart
@@ -29,13 +29,13 @@
     );
 
     await tester.tap(find.text('Go'));
-    await tester.pumpAndSettle();
+    await tester.pump();
 
-    expect(find.byType(CupertinoActionSheet), findsOneWidget);
+    expect(find.text('Action Sheet'), findsOneWidget);
 
-    await tester.tap(find.byType(ModalBarrier).last);
-    await tester.pumpAndSettle();
-    expect(find.byType(CupertinoActionSheet), findsNothing);
+    await tester.tapAt(const Offset(20.0, 20.0));
+    await tester.pump();
+    expect(find.text('Action Sheet'), findsNothing);
   });
 
   testWidgets('Verify that a tap on title section (not buttons) does not dismiss an action sheet', (WidgetTester tester) async {
@@ -867,7 +867,7 @@
     expect(find.byType(CupertinoActionSheet), findsNothing);
   });
 
-  testWidgets('Modal barrier cannot be dismissed during transition', (WidgetTester tester) async {
+  testWidgets('Modal barrier is pressed during transition', (WidgetTester tester) async {
     await tester.pumpWidget(
       createAppWithButtonThatLaunchesActionSheet(
         CupertinoActionSheet(
@@ -906,20 +906,21 @@
     await tester.pump(const Duration(milliseconds: 60));
     expect(tester.getTopLeft(find.byType(CupertinoActionSheet)).dy, moreOrLessEquals(337.1, epsilon: 0.1));
 
-    // Attempt to dismiss
+    // Exit animation
     await tester.tapAt(const Offset(20.0, 20.0));
     await tester.pump(const Duration(milliseconds: 60));
 
-    // Enter animation is continuing
-    expect(tester.getTopLeft(find.byType(CupertinoActionSheet)).dy, moreOrLessEquals(325.4, epsilon: 0.1));
+    await tester.pump(const Duration(milliseconds: 60));
+    expect(tester.getTopLeft(find.byType(CupertinoActionSheet)).dy, moreOrLessEquals(374.3, epsilon: 0.1));
 
-    await tester.pumpAndSettle();
+    await tester.pump(const Duration(milliseconds: 60));
+    expect(tester.getTopLeft(find.byType(CupertinoActionSheet)).dy, moreOrLessEquals(470.0, epsilon: 0.1));
 
-    // Attempt to dismiss again
-    await tester.tapAt(const Offset(20.0, 20.0));
-    await tester.pumpAndSettle();
+    await tester.pump(const Duration(milliseconds: 60));
+    expect(tester.getTopLeft(find.byType(CupertinoActionSheet)).dy, 600.0);
 
     // Action sheet has disappeared
+    await tester.pump(const Duration(milliseconds: 60));
     expect(find.byType(CupertinoActionSheet), findsNothing);
   });
 
@@ -951,7 +952,7 @@
     );
 
     await tester.tap(find.text('Go'));
-    await tester.pumpAndSettle();
+    await tester.pump();
 
     expect(
       semantics,
diff --git a/packages/flutter/test/cupertino/dialog_test.dart b/packages/flutter/test/cupertino/dialog_test.dart
index dc2679a..680cdbc 100644
--- a/packages/flutter/test/cupertino/dialog_test.dart
+++ b/packages/flutter/test/cupertino/dialog_test.dart
@@ -1074,8 +1074,6 @@
     transition = tester.firstWidget(fadeTransitionFinder);
     expect(transition.opacity.value, moreOrLessEquals(1.0, epsilon: 0.001));
 
-    await tester.pumpAndSettle();
-
     await tester.tap(find.text('Delete'));
 
     // Exit animation, look at reverse FadeTransition.
diff --git a/packages/flutter/test/cupertino/route_test.dart b/packages/flutter/test/cupertino/route_test.dart
index 6884a53..a60a7b6 100644
--- a/packages/flutter/test/cupertino/route_test.dart
+++ b/packages/flutter/test/cupertino/route_test.dart
@@ -442,8 +442,6 @@
     await tester.pump(const Duration(milliseconds: 40));
     expect(tester.getTopLeft(find.byType(Placeholder)).dy, moreOrLessEquals(0.0, epsilon: 0.1));
 
-    await tester.pumpAndSettle();
-
     // Exit animation
     await tester.tap(find.text('Close'));
     await tester.pump();
@@ -549,8 +547,6 @@
     await tester.pump(const Duration(milliseconds: 40));
     expect(tester.getTopLeft(find.byType(Placeholder)).dx, moreOrLessEquals(-267.0, epsilon: 1.0));
 
-    await tester.pumpAndSettle();
-
     // Exit animation
     await tester.tap(find.text('Close'));
     await tester.pump();
@@ -640,8 +636,6 @@
     await tester.pump(const Duration(milliseconds: 40));
     expect(tester.getTopLeft(find.byType(Placeholder)).dx, 0.0);
 
-    await tester.pumpAndSettle();
-
     // Exit animation
     await tester.tap(find.text('Close'));
     await tester.pump();
@@ -661,221 +655,6 @@
     await testNoParallax(tester, fromFullscreenDialog: true);
   });
 
-  group('Route interactivity during transition animations', () {
-    testWidgets('CupertinoPageRoute ignores pointers when route on top of it pops', (WidgetTester tester) async {
-      final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
-      bool homeTapped = false;
-      await tester.pumpWidget(
-        CupertinoApp(
-          navigatorKey: navigatorKey,
-          home: TextButton(
-            onPressed: () => homeTapped = true,
-            child: const Text('Home'),
-          ),
-        ),
-      );
-
-      navigatorKey.currentState!.push<void>(
-        CupertinoPageRoute<void>(
-          builder: (_) => const Text('Page 2'),
-        )
-      );
-      await tester.pumpAndSettle();
-
-      expect(find.text('Page 2'), findsOneWidget);
-
-      navigatorKey.currentState!.pop();
-      await tester.pump(const Duration(milliseconds: 100));
-
-      expect(find.text('Page 2'), findsOneWidget); // Transition still in progress
-
-      await tester.tap(find.text('Home'), warnIfMissed: false); // Home route is not tappable
-      expect(homeTapped, false);
-
-      await tester.pumpAndSettle(); // Transition completes
-
-      await tester.tap(find.text('Home'));
-      expect(homeTapped, true);
-    });
-
-    testWidgets('fullscreenDialog CupertinoPageRoute ignores pointers when route on top of it pops', (WidgetTester tester) async {
-      bool homeTapped = false;
-      await tester.pumpWidget(
-        CupertinoApp(
-          home: TextButton(
-            onPressed: () => homeTapped = true,
-            child: const Text('Home'),
-          ),
-        ),
-      );
-
-      tester.state<NavigatorState>(find.byType(Navigator)).push<void>(
-        CupertinoPageRoute<void>(
-          fullscreenDialog: true,
-          builder: (_) => const Text('Page 2'),
-        )
-      );
-      await tester.pumpAndSettle();
-
-      expect(find.text('Page 2'), findsOneWidget);
-
-      tester.state<NavigatorState>(find.byType(Navigator)).pop();
-      await tester.pump(const Duration(milliseconds: 100));
-
-      expect(find.text('Page 2'), findsOneWidget); // Transition still in progress
-
-      await tester.tap(find.text('Home'), warnIfMissed: false); // Home route is not tappable
-      expect(homeTapped, false);
-
-      await tester.pumpAndSettle(); // Transition completes
-
-      await tester.tap(find.text('Home'));
-      expect(homeTapped, true);
-    });
-
-    testWidgets('CupertinoPageRoute ignores pointers when user pop gesture is in progress', (WidgetTester tester) async {
-      bool homeTapped = false;
-      await tester.pumpWidget(
-        CupertinoApp(
-          home: TextButton(
-            onPressed: () => homeTapped = true,
-            child: const Text('Page 1'),
-          ),
-        ),
-      );
-
-      tester.state<NavigatorState>(find.byType(Navigator)).push(
-        CupertinoPageRoute<void>(
-          builder: (_) => const Text('Page 2'),
-        ),
-      );
-      await tester.pumpAndSettle();
-
-      expect(find.text('Page 1'), findsNothing);
-
-      final TestGesture swipeGesture = await tester.startGesture(const Offset(5, 100));
-
-      await swipeGesture.moveBy(const Offset(100, 0));
-      await tester.pump();
-
-      expect(find.text('Page 1'), findsOneWidget);
-      expect(tester.state<NavigatorState>(find.byType(Navigator)).userGestureInProgress, true);
-
-      await tester.tap(find.text('Page 1'), warnIfMissed: false);
-      expect(homeTapped, false);
-    });
-
-    testWidgets('CupertinoPageRoute ignores pointers when it is pushed on top of other route', (WidgetTester tester) async {
-      await tester.pumpWidget(
-        CupertinoApp(
-          onGenerateRoute: (_) => CupertinoPageRoute<void>(
-            builder: (_) => const Text('Home'),
-          ),
-        ),
-      );
-
-      await tester.tap(find.text('Home'));
-      tester.state<NavigatorState>(find.byType(Navigator)).push(
-        CupertinoPageRoute<void>(
-          builder: (_) => const Text('Page 2'),
-        ),
-      );
-      await tester.pump();
-      await tester.pump(const Duration(milliseconds: 100));
-
-      expect(find.text('Home'), findsOneWidget); // Transition still in progress
-
-      // Can't test directly for taps because route is interactive but offstage
-      // One ignore pointer for each of two overlay entries (ModalScope, ModalBarrier) on each of two routes
-      expect(find.byType(IgnorePointer, skipOffstage: false), findsNWidgets(4));
-      final List<Element> ignorePointers = find.byType(IgnorePointer, skipOffstage: false).evaluate().toList();
-      expect((ignorePointers.first.widget as IgnorePointer).ignoring, true); // Home modalBarrier
-      expect((ignorePointers[1].widget as IgnorePointer).ignoring, true);    // Home modalScope
-      expect((ignorePointers[2].widget as IgnorePointer).ignoring, true);    // Page 2 modalBarrier
-      expect((ignorePointers.last.widget as IgnorePointer).ignoring, true);  // Page 2 modalScope
-    });
-
-    testWidgets('showCupertinoDialog ignores pointers until transition completes', (WidgetTester tester) async {
-      await tester.pumpWidget(
-        CupertinoApp(
-          home: Builder(
-            builder: (BuildContext context) {
-              return TextButton(
-                onPressed: () {
-                  showCupertinoModalPopup<void>(
-                    context: context,
-                    builder: (BuildContext innerContext) => TextButton(
-                      onPressed: Navigator.of(innerContext).pop,
-                      child: const Text('dialog'),
-                    ),
-                  );
-                },
-                child: const Text('Show Dialog'),
-              );
-            },
-          ),
-        ),
-      );
-
-      // Open the dialog.
-      await tester.tap(find.byType(TextButton));
-      await tester.pump(const Duration(milliseconds: 100));
-
-      // Trigger pop while the transition is in progress
-      await tester.tap(find.text('dialog'), warnIfMissed: false);
-      await tester.pumpAndSettle();
-
-      // Transition is over and the dialog has not been dismissed
-      expect(find.text('dialog'), findsOneWidget);
-
-      await tester.tap(find.text('dialog'));
-      await tester.pumpAndSettle();
-
-      // The dialog has not been dismissed
-      expect(find.text('dialog'), findsNothing);
-    });
-
-    testWidgets('showCupertinoModalPopup ignores pointers until transition completes', (WidgetTester tester) async {
-      await tester.pumpWidget(
-        CupertinoApp(
-          home: Builder(
-            builder: (BuildContext context) {
-              return TextButton(
-                onPressed: () {
-                  showCupertinoModalPopup<void>(
-                    context: context,
-                    builder: (BuildContext innerContext) => TextButton(
-                      onPressed: Navigator.of(innerContext).pop,
-                      child: const Text('modal'),
-                    ),
-                  );
-                },
-                child: const Text('Show modal'),
-              );
-            },
-          ),
-        ),
-      );
-
-      // Open the modal popup
-      await tester.tap(find.byType(TextButton));
-      await tester.pump(const Duration(milliseconds: 100));
-
-      // Trigger pop while the transition is in progress
-      await tester.tap(find.text('modal'), warnIfMissed: false);
-      await tester.pumpAndSettle();
-
-      // Transition is over and the dialog has not been dismissed
-      expect(find.text('modal'), findsOneWidget);
-
-      await tester.tap(find.text('modal'));
-      await tester.pumpAndSettle();
-
-      // The dialog has not been dismissed
-      expect(find.text('modal'), findsNothing);
-    });
-  });
-
   testWidgets('Animated push/pop is not linear', (WidgetTester tester) async {
     await tester.pumpWidget(
       const CupertinoApp(
diff --git a/packages/flutter/test/material/page_test.dart b/packages/flutter/test/material/page_test.dart
index 6082cd6..42b63de 100644
--- a/packages/flutter/test/material/page_test.dart
+++ b/packages/flutter/test/material/page_test.dart
@@ -432,7 +432,6 @@
         routes: routes,
       ),
     );
-    expect(await tester.pumpAndSettle(const Duration(minutes: 1)), 2);
     await tester.tap(find.text('PUSH'));
     expect(await tester.pumpAndSettle(const Duration(minutes: 1)), 2);
     expect(find.text('PUSH'), findsNothing);
@@ -791,8 +790,8 @@
 
     // Tapping the "page" route's back button doesn't do anything either.
     await tester.tap(find.byTooltip('Back'), warnIfMissed: false);
-    await tester.pump();
-    expect(tester.getTopLeft(find.byKey(pageScaffoldKey, skipOffstage: false)), const Offset(400, 0));
+    await tester.pumpAndSettle();
+    expect(tester.getTopLeft(find.byKey(pageScaffoldKey)), const Offset(400, 0));
     expect(tester.getTopLeft(find.byKey(homeScaffoldKey)).dx, lessThan(0));
   }, variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.iOS,  TargetPlatform.macOS }));
 
diff --git a/packages/flutter/test/widgets/routes_test.dart b/packages/flutter/test/widgets/routes_test.dart
index 1120615..ad36da4 100644
--- a/packages/flutter/test/widgets/routes_test.dart
+++ b/packages/flutter/test/widgets/routes_test.dart
@@ -940,36 +940,6 @@
       expect(trainHopper2.currentTrain, isNull); // Has been disposed.
     });
 
-    testWidgets('secondary animation is AnimationMin when transition route that cannot be transitioned to or from pops', (WidgetTester tester) async {
-      final PageRoute<void> pageRouteOne = MaterialPageRoute<void>(
-        builder: (_) => const Text('Page One'),
-      );
-
-      await tester.pumpWidget(
-        MaterialApp(
-          onGenerateRoute: (_) => pageRouteOne,
-        ),
-      );
-
-      final PageRoute<void> pageRouteTwo = MaterialPageRoute<void>(
-        fullscreenDialog: true,
-        builder: (_) => const Text('Page Two'),
-      );
-
-      tester.state<NavigatorState>(find.byType(Navigator)).push(pageRouteTwo);
-      await tester.pumpAndSettle();
-
-      tester.state<NavigatorState>(find.byType(Navigator)).pop();
-      await tester.pump();
-
-      expect(
-        ((pageRouteOne.secondaryAnimation! as ProxyAnimation).parent! as ProxyAnimation).parent,
-        isA<AnimationMin<double>>()
-          ..having((AnimationMin<double> a) => a.first, 'first', equals(kAlwaysDismissedAnimation))
-          ..having((AnimationMin<double> a) => a.next, 'first', equals(pageRouteTwo.animation)),
-      );
-    });
-
     testWidgets('secondary animation is triggered when pop initial route', (WidgetTester tester) async {
       final GlobalKey<NavigatorState> navigator = GlobalKey<NavigatorState>();
       late Animation<double> secondaryAnimationOfRouteOne;
@@ -1041,41 +1011,6 @@
       expect(find.byType(ModalBarrier), findsNWidgets(1));
     });
 
-    testWidgets('showGeneralDialog ModalBarrier does not ignore pointers during transitions', (WidgetTester tester) async {
-      await tester.pumpWidget(
-        MaterialApp(
-          home: Builder(
-            builder: (BuildContext context) {
-              return TextButton(
-                onPressed: () {
-                  showGeneralDialog<void>(
-                    context: context,
-                    transitionDuration: const Duration(milliseconds: 400),
-                    pageBuilder: (BuildContext innerContext, __, ___) => TextButton(
-                      onPressed: Navigator.of(innerContext).pop,
-                      child: const Text('dialog'),
-                    ),
-                  );
-                },
-                child: const Text('Show Dialog'),
-              );
-            },
-          ),
-        ),
-      );
-
-      // Open the dialog.
-      await tester.tap(find.byType(TextButton));
-      await tester.pump(const Duration(milliseconds: 200));
-
-      // Trigger pop while the transition is in progress
-      await tester.tap(find.text('dialog'));
-      await tester.pumpAndSettle();
-
-      // The dialog has been dismissed mid-transition
-      expect(find.text('dialog'), findsNothing);
-    });
-
     testWidgets('showGeneralDialog adds non-dismissible barrier when barrierDismissible is false', (WidgetTester tester) async {
       await tester.pumpWidget(MaterialApp(
         home: Builder(
@@ -1371,67 +1306,6 @@
       });
     });
 
-    testWidgets('does not ignore pointers when route on top of it pops', (WidgetTester tester) async {
-      await tester.pumpWidget(
-        MaterialApp(
-          theme: ThemeData(
-            pageTransitionsTheme: const PageTransitionsTheme(
-              builders: <TargetPlatform, PageTransitionsBuilder>{
-                // Use a transitions builder that will keep the underlying content
-                // partially visible during a transition
-                TargetPlatform.android: FadeUpwardsPageTransitionsBuilder(),
-              },
-            )
-          ),
-          home: const Text('Home'),
-        ),
-      );
-
-      tester.state<NavigatorState>(find.byType(Navigator)).push<void>(
-        MaterialPageRoute<void>(builder: (_) => const Text('Page 2'))
-      );
-
-      await tester.pumpAndSettle();
-      expect(find.text('Page 2'), findsOneWidget);
-
-      tester.state<NavigatorState>(find.byType(Navigator)).pop();
-      await tester.pump(const Duration(milliseconds: 100));
-
-      expect(find.text('Page 2'), findsOneWidget); // Transition still in progress
-
-      await tester.tap(find.text('Home')); // Home route is tappable
-    });
-
-    testWidgets('does not ignore pointers during its own entrance animation', (WidgetTester tester) async {
-      await tester.pumpWidget(
-        MaterialApp(
-          onGenerateRoute: (_) => MaterialPageRoute<void>(
-            builder: (_) => const Text('Home'),
-          ),
-        ),
-      );
-
-      await tester.tap(find.text('Home'));
-      tester.state<NavigatorState>(find.byType(Navigator)).push(
-        MaterialPageRoute<void>(
-          builder: (_) => const Text('Page 2'),
-        ),
-      );
-      await tester.pump();
-      await tester.pump(const Duration(milliseconds: 100));
-
-      expect(find.text('Home'), findsOneWidget); // Transition still in progress
-
-      // Can't test directly for taps because route is interactive but offstage
-      // One ignore pointer for each of two overlay entries (ModalScope, ModalBarrier) on each of two routes
-      expect(find.byType(IgnorePointer, skipOffstage: false), findsNWidgets(4));
-      final List<Element> ignorePointers = find.byType(IgnorePointer, skipOffstage: false).evaluate().toList();
-      expect((ignorePointers.first.widget as IgnorePointer).ignoring, true); // Home modalBarrier
-      expect((ignorePointers[1].widget as IgnorePointer).ignoring, true);    // Home modalScope
-      expect((ignorePointers[2].widget as IgnorePointer).ignoring, false);   // Page 2 modalBarrier
-      expect((ignorePointers.last.widget as IgnorePointer).ignoring, false); // Page 2 modalScope
-    });
-
     testWidgets('reverseTransitionDuration defaults to transitionDuration', (WidgetTester tester) async {
       final GlobalKey containerKey = GlobalKey();
 
diff --git a/packages/flutter_test/test/widget_tester_test.dart b/packages/flutter_test/test/widget_tester_test.dart
index 6f1a917..c10992f 100644
--- a/packages/flutter_test/test/widget_tester_test.dart
+++ b/packages/flutter_test/test/widget_tester_test.dart
@@ -440,7 +440,7 @@
 
       await tester.tap(find.text('Next'));
       await tester.pump();
-      await tester.pumpAndSettle();
+      await tester.pump(const Duration(milliseconds: 400));
 
       await tester.pageBack();
       await tester.pump();
