diff --git a/packages/core/ui/core/view-base/index.ts b/packages/core/ui/core/view-base/index.ts index d458e1d04..58dd4c561 100644 --- a/packages/core/ui/core/view-base/index.ts +++ b/packages/core/ui/core/view-base/index.ts @@ -845,6 +845,12 @@ export abstract class ViewBase extends Observable implements ViewBaseDefinition // } + public _inheritStyles(view: ViewBase): void { + propagateInheritableProperties(this, view); + view._inheritStyleScope(this._styleScope); + propagateInheritableCssProperties(this.style, view.style); + } + @profile public _addView(view: ViewBase, atIndex?: number) { if (Trace.isEnabled()) { @@ -874,9 +880,7 @@ export abstract class ViewBase extends Observable implements ViewBaseDefinition * Method is intended to be overridden by inheritors and used as "protected" */ public _addViewCore(view: ViewBase, atIndex?: number) { - propagateInheritableProperties(this, view); - view._inheritStyleScope(this._styleScope); - propagateInheritableCssProperties(this.style, view.style); + this._inheritStyles(view); if (this._context) { view._setupUI(this._context, atIndex); diff --git a/packages/core/ui/frame/frame-common.ts b/packages/core/ui/frame/frame-common.ts index 495126486..fa42e9ac6 100644 --- a/packages/core/ui/frame/frame-common.ts +++ b/packages/core/ui/frame/frame-common.ts @@ -243,6 +243,7 @@ export class FrameBase extends CustomLayoutView { public setCurrent(entry: BackstackEntry, navigationType: NavigationType): void { const newPage = entry.resolvedPage; + // In case we navigated forward to a page that was in the backstack // with clearHistory: true if (!newPage.frame) { diff --git a/packages/core/ui/frame/index.android.ts b/packages/core/ui/frame/index.android.ts index 340604e53..db50c35de 100644 --- a/packages/core/ui/frame/index.android.ts +++ b/packages/core/ui/frame/index.android.ts @@ -916,6 +916,8 @@ class FragmentCallbacksImplementation implements AndroidFragmentCallbacks { frame._resolvedPage = page; if (page.parent === frame) { + frame._inheritStyles(page); + // If we are navigating to a page that was destroyed // reinitialize its UI. if (!page._context) { @@ -927,12 +929,16 @@ class FragmentCallbacksImplementation implements AndroidFragmentCallbacks { page.callLoaded(); } } else { - if (!frame._styleScope) { - // Make sure page will have styleScope even if parents don't. - page._updateStyleScope(); - } + if (!page.parent) { + if (!frame._styleScope) { + // Make sure page will have styleScope even if parents don't. + page._updateStyleScope(); + } - frame._addView(page); + frame._addView(page); + } else { + throw new Error('Page is already shown on another frame.'); + } } const savedState = entry.viewSavedState; diff --git a/packages/core/ui/page/index.ios.ts b/packages/core/ui/page/index.ios.ts index 48063ee9a..6accb8634 100644 --- a/packages/core/ui/page/index.ios.ts +++ b/packages/core/ui/page/index.ios.ts @@ -133,15 +133,19 @@ class UIViewControllerImpl extends UIViewController { if (frame) { frame._resolvedPage = owner; - if (!owner.parent) { - if (!frame._styleScope) { - // Make sure page will have styleScope even if frame don't. - owner._updateStyleScope(); - } + if (owner.parent === frame) { + frame._inheritStyles(owner); + } else { + if (!owner.parent) { + if (!frame._styleScope) { + // Make sure page will have styleScope even if frame don't. + owner._updateStyleScope(); + } - frame._addView(owner); - } else if (owner.parent !== frame) { - throw new Error('Page is already shown on another frame.'); + frame._addView(owner); + } else { + throw new Error('Page is already shown on another frame.'); + } } frame._updateActionBar(owner);