diff --git a/packages/core/ui/frame/frame-common.ts b/packages/core/ui/frame/frame-common.ts index a79a1808b8..d05542f5dc 100644 --- a/packages/core/ui/frame/frame-common.ts +++ b/packages/core/ui/frame/frame-common.ts @@ -217,6 +217,13 @@ export class FrameBase extends CustomLayoutView { removed.resolvedPage = null; } + protected _disposeBackstackEntry(entry: BackstackEntry): void { + const page = entry.resolvedPage; + if (page) { + page._tearDownUI(true); + } + } + public navigate(param: any) { if (Trace.isEnabled()) { Trace.write(`NAVIGATE`, Trace.categories.Navigation); diff --git a/packages/core/ui/frame/index.android.ts b/packages/core/ui/frame/index.android.ts index ecd6c35c18..1bf7569a14 100644 --- a/packages/core/ui/frame/index.android.ts +++ b/packages/core/ui/frame/index.android.ts @@ -318,11 +318,11 @@ export class Frame extends FrameBase { if (this._tearDownPending) { this._tearDownPending = false; if (!entry.recreated) { - clearEntry(entry); + this._disposeBackstackEntry(entry); } if (current && !current.recreated) { - clearEntry(current); + this._disposeBackstackEntry(current); } // If we have context activity was recreated. Create new fragment @@ -493,6 +493,17 @@ export class Frame extends FrameBase { removed.viewSavedState = null; } + protected _disposeBackstackEntry(entry: BackstackEntry): void { + if (entry.fragment) { + _clearFragment(entry); + } + + entry.recreated = false; + entry.fragment = null; + + super._disposeBackstackEntry(entry); + } + public createNativeView() { // Create native view with available _currentEntry occur in Don't Keep Activities // scenario when Activity is recreated on app suspend/resume. Push frame back in frame stack @@ -527,12 +538,12 @@ export class Frame extends FrameBase { // Don't destroy current and executing entries or UI will look blank. // We will do it in setCurrent. if (entry !== executingEntry) { - clearEntry(entry); + this._disposeBackstackEntry(entry); } }); if (current && !executingEntry) { - clearEntry(current); + this._disposeBackstackEntry(current); } this._android.rootViewGroup = null; @@ -641,19 +652,6 @@ function restoreTransitionState(entry: BackstackEntry, snapshot: TransitionState expandedEntry.transitionName = snapshot.transitionName; } -function clearEntry(entry: BackstackEntry): void { - if (entry.fragment) { - _clearFragment(entry); - } - - entry.recreated = false; - entry.fragment = null; - const page = entry.resolvedPage; - if (page && page._context) { - entry.resolvedPage._tearDownUI(true); - } -} - let framesCounter = 0; const framesCache = new Array>(); diff --git a/packages/core/ui/frame/index.ios.ts b/packages/core/ui/frame/index.ios.ts index ae198434b0..33787b214c 100644 --- a/packages/core/ui/frame/index.ios.ts +++ b/packages/core/ui/frame/index.ios.ts @@ -42,6 +42,23 @@ export class Frame extends FrameBase { } public disposeNativeView() { + const current = this._currentEntry; + const executingEntry = this._executingContext ? this._executingContext.entry : null; + + if (executingEntry) { + this._disposeBackstackEntry(executingEntry); + } + + this.backStack.forEach((entry) => { + if (entry !== executingEntry) { + this._disposeBackstackEntry(entry); + } + }); + + if (current) { + this._disposeBackstackEntry(current); + } + this._removeFromFrameStack(); this.viewController = null; this._animatedDelegate = null;