From 5f8fb2c36aaf59b64fc4abec175c7ed68f3ed5ca Mon Sep 17 00:00:00 2001 From: Dimitris-Rafail Katsampas Date: Thu, 23 Jan 2025 00:22:36 +0200 Subject: [PATCH] fix(ios): frame backstack disposal handling (#10672) --- packages/core/ui/frame/frame-common.ts | 7 ++++++ packages/core/ui/frame/index.android.ts | 32 ++++++++++++------------- packages/core/ui/frame/index.ios.ts | 17 +++++++++++++ 3 files changed, 39 insertions(+), 17 deletions(-) diff --git a/packages/core/ui/frame/frame-common.ts b/packages/core/ui/frame/frame-common.ts index a79a1808b..d05542f5d 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 ecd6c35c1..1bf7569a1 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 ae198434b..33787b214 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;