fix(ios): frame backstack disposal handling (#10672)

This commit is contained in:
Dimitris-Rafail Katsampas
2025-01-23 00:22:36 +02:00
committed by GitHub
parent d3d4dfe322
commit 5f8fb2c36a
3 changed files with 39 additions and 17 deletions

View File

@ -217,6 +217,13 @@ export class FrameBase extends CustomLayoutView {
removed.resolvedPage = null; removed.resolvedPage = null;
} }
protected _disposeBackstackEntry(entry: BackstackEntry): void {
const page = entry.resolvedPage;
if (page) {
page._tearDownUI(true);
}
}
public navigate(param: any) { public navigate(param: any) {
if (Trace.isEnabled()) { if (Trace.isEnabled()) {
Trace.write(`NAVIGATE`, Trace.categories.Navigation); Trace.write(`NAVIGATE`, Trace.categories.Navigation);

View File

@ -318,11 +318,11 @@ export class Frame extends FrameBase {
if (this._tearDownPending) { if (this._tearDownPending) {
this._tearDownPending = false; this._tearDownPending = false;
if (!entry.recreated) { if (!entry.recreated) {
clearEntry(entry); this._disposeBackstackEntry(entry);
} }
if (current && !current.recreated) { if (current && !current.recreated) {
clearEntry(current); this._disposeBackstackEntry(current);
} }
// If we have context activity was recreated. Create new fragment // If we have context activity was recreated. Create new fragment
@ -493,6 +493,17 @@ export class Frame extends FrameBase {
removed.viewSavedState = null; removed.viewSavedState = null;
} }
protected _disposeBackstackEntry(entry: BackstackEntry): void {
if (entry.fragment) {
_clearFragment(entry);
}
entry.recreated = false;
entry.fragment = null;
super._disposeBackstackEntry(entry);
}
public createNativeView() { public createNativeView() {
// Create native view with available _currentEntry occur in Don't Keep Activities // 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 // 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. // Don't destroy current and executing entries or UI will look blank.
// We will do it in setCurrent. // We will do it in setCurrent.
if (entry !== executingEntry) { if (entry !== executingEntry) {
clearEntry(entry); this._disposeBackstackEntry(entry);
} }
}); });
if (current && !executingEntry) { if (current && !executingEntry) {
clearEntry(current); this._disposeBackstackEntry(current);
} }
this._android.rootViewGroup = null; this._android.rootViewGroup = null;
@ -641,19 +652,6 @@ function restoreTransitionState(entry: BackstackEntry, snapshot: TransitionState
expandedEntry.transitionName = snapshot.transitionName; 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; let framesCounter = 0;
const framesCache = new Array<WeakRef<AndroidFrame>>(); const framesCache = new Array<WeakRef<AndroidFrame>>();

View File

@ -42,6 +42,23 @@ export class Frame extends FrameBase {
} }
public disposeNativeView() { 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._removeFromFrameStack();
this.viewController = null; this.viewController = null;
this._animatedDelegate = null; this._animatedDelegate = null;