didReplace method

  1. @override
void didReplace({
  1. Route? newRoute,
  2. Route? oldRoute,
})
override

The Navigator replaced oldRoute with newRoute.

Implementation

@override
void didReplace({Route<dynamic>? newRoute, Route<dynamic>? oldRoute}) {
  super.didReplace(newRoute: newRoute, oldRoute: oldRoute);
  if (newRoute == null || oldRoute == null) return;

  RouteEntry oldEntry = _getRouteEntry(oldRoute);
  RouteEntry newEntry = RouteEntry(newRoute);
  int index = _history.indexOf(oldEntry);
  assert(index != -1);
  bool isLast = _history.last == oldEntry; // 被replace的是否是最上层的route
  // print('LifecycleObserver($hashCode)#didReplace('
  //     'newRoute: ${newRoute.settings.name}, '
  //     'oldRoute: ${oldRoute.settings.name}, isLast: $isLast)');

  // 被replace的oldRoute触发invisible
  _sendEventsToGivenRoute(oldEntry, lifecycleEventsInactiveAndInvisible);
  _history.remove(oldEntry);

  if (isLast) {
    // 用PopupRoute替换PageRoute
    if (oldRoute is PageRoute && newRoute is PopupRoute) {
      // Previous PageRoute trigger visible
      //
      // 前一个PageRoute触发visible
      _sendEventsToLastPageRoute([LifecycleEvent.visible]);
    }
    // 用PageRoute替换PopupRoute
    else if (oldRoute is PopupRoute && newRoute is PageRoute) {
      // todo: Previous PopupRoute trigger invisible ?
      // Previous PageRoute trigger invisible
      //
      // 前一个PageRoute触发invisible
      _sendEventsToLastPageRoute(lifecycleEventsInactiveAndInvisible);
    }
  }

  _history.insert(index, newEntry);
}