diff --git a/packages/core/ui/frame/frame-common.ts b/packages/core/ui/frame/frame-common.ts index 33edd741c1..e53251374d 100644 --- a/packages/core/ui/frame/frame-common.ts +++ b/packages/core/ui/frame/frame-common.ts @@ -427,25 +427,43 @@ export class FrameBase extends CustomLayoutView { @profile public performNavigation(navigationContext: NavigationContext) { - this._executingContext = navigationContext; - - const backstackEntry = navigationContext.entry; - const isBackNavigation = navigationContext.navigationType === NavigationType.back; - this._onNavigatingTo(backstackEntry, isBackNavigation); - const navigationTransition = this._getNavigationTransition(backstackEntry.entry); - if (navigationTransition?.instance) { - const state = SharedTransition.getState(navigationTransition?.instance.id); - SharedTransition.updateState(navigationTransition?.instance.id, { - // Allow setting custom page context to override default (from) page - // helpful for deeply nested frame navigation setups (eg: Nested Tab Navigation) - // when sharing elements in this condition, the (from) page would - // get overridden on each frame preventing shared element matching - page: state?.page || this.currentPage, - toPage: this, - }); - } - this._navigateCore(backstackEntry); - } + this._executingContext = navigationContext; + + const backstackEntry = navigationContext.entry; + const isBackNavigation = navigationContext.navigationType === NavigationType.Back; + + // --- PATCH START --- + try { + const entryContext = backstackEntry?.entry?.context; + const entryBindingContext = backstackEntry?.entry?.bindingContext; + const resolvedPage = backstackEntry?.resolvedPage; + + if (resolvedPage && entryContext !== undefined && entryContext !== null) { + (resolvedPage as any)._navigationContext = entryContext; + + if (entryBindingContext == null && resolvedPage.bindingContext == null) { + try { + resolvedPage.bindingContext = entryContext; + } catch (_) {} + } + } + } catch (_) {} + // --- PATCH END --- + + this._onNavigatingTo(backstackEntry, isBackNavigation); + + const navigationTransition = this._getNavigationTransition(backstackEntry); + if (navigationTransition?.instance) { + const state = SharedTransition.getState(navigationTransition?.instance.id); + SharedTransition.updateState(navigationTransition?.instance.id, { + page: state?.page || this.currentPage, + toPage: this, + }); + } + + this._navigateCore(backstackEntry); +} + @profile performGoBack(navigationContext: NavigationContext) {