didReplace method
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);
}