mirror of
https://github.com/NativeScript/NativeScript.git
synced 2025-08-16 20:11:24 +08:00
fix: check is disposed fragment is in fragmentMngr
This commit is contained in:
@ -87,6 +87,16 @@ function getAttachListener(): android.view.View.OnAttachStateChangeListener {
|
|||||||
return attachStateChangeListener;
|
return attachStateChangeListener;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function nativeArrayIncludes<T>(arr: native.Array<T>, what: T): boolean {
|
||||||
|
for (let i = 0; i < arr.length; i++) {
|
||||||
|
if (arr[i] === what) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
export class Frame extends FrameBase {
|
export class Frame extends FrameBase {
|
||||||
public _originalBackground: any;
|
public _originalBackground: any;
|
||||||
private _android: AndroidFrame;
|
private _android: AndroidFrame;
|
||||||
@ -264,13 +274,28 @@ export class Frame extends FrameBase {
|
|||||||
!this._currentEntry.fragment.isAdded()) {
|
!this._currentEntry.fragment.isAdded()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
const fragmentManager: androidx.fragment.app.FragmentManager = this._getFragmentManager();
|
||||||
|
|
||||||
const manager: androidx.fragment.app.FragmentManager = this._getFragmentManager();
|
// Check if manager contains the fragment to be removed
|
||||||
const transaction = manager.beginTransaction();
|
// This might happen when a dialog is already closed with android back btn
|
||||||
const fragment = this._currentEntry.fragment;
|
const fragment = this._currentEntry.fragment;
|
||||||
|
const fragmentFound = nativeArrayIncludes(fragmentManager.getFragments().toArray(), fragment);
|
||||||
|
|
||||||
|
if (traceEnabled()) {
|
||||||
|
const message = fragmentFound ?
|
||||||
|
`Frame.disposeCurrentFragment - fragment(${fragment}) found in fragmentManager(${fragmentManager}). Removing ...` :
|
||||||
|
`Frame.disposeCurrentFragment - fragment(${fragment}) NOT found in fragmentManager(${fragmentManager}). Skipping remove`;
|
||||||
|
traceWrite(message, traceCategories.NativeLifecycle);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!fragmentFound) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const transaction = fragmentManager.beginTransaction();
|
||||||
const fragmentExitTransition = fragment.getExitTransition();
|
const fragmentExitTransition = fragment.getExitTransition();
|
||||||
|
|
||||||
// Reset animation to its initial state to prevent mirrorered effect when restore current fragment transitions
|
// Reset animation to its initial state to prevent mirrored effect when restore current fragment transitions
|
||||||
if (fragmentExitTransition && fragmentExitTransition instanceof org.nativescript.widgets.CustomTransition) {
|
if (fragmentExitTransition && fragmentExitTransition instanceof org.nativescript.widgets.CustomTransition) {
|
||||||
fragmentExitTransition.setResetOnTransitionEnd(true);
|
fragmentExitTransition.setResetOnTransitionEnd(true);
|
||||||
}
|
}
|
||||||
|
@ -6,8 +6,6 @@ import {
|
|||||||
export { ios };
|
export { ios };
|
||||||
export * from "./utils-common";
|
export * from "./utils-common";
|
||||||
|
|
||||||
let mainScreenScale;
|
|
||||||
|
|
||||||
export function openFile(filePath: string): boolean {
|
export function openFile(filePath: string): boolean {
|
||||||
try {
|
try {
|
||||||
const appPath = ios.getCurrentAppPath();
|
const appPath = ios.getCurrentAppPath();
|
||||||
@ -47,5 +45,3 @@ export function openUrl(location: string): boolean {
|
|||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
mainScreenScale = UIScreen.mainScreen.scale;
|
|
||||||
|
Reference in New Issue
Block a user