From f29507f4a443aac01b4390572a1d5c419e4021e0 Mon Sep 17 00:00:00 2001 From: vardhan30016 Date: Mon, 24 Nov 2025 10:34:32 +0530 Subject: [PATCH] fix(navigation): forward NavigationEntry.context to page and bindingContext when none provided (closes #10912) --- packages/core/ui/frame/frame-common.ts | 56 +++++++++++++++++--------- 1 file changed, 37 insertions(+), 19 deletions(-) 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) {