fix: check is disposed fragment is in fragmentMngr

This commit is contained in:
vakrilov
2019-12-04 14:24:37 +02:00
parent f5d6e4f5ed
commit a75397af20
2 changed files with 28 additions and 7 deletions

View File

@ -87,6 +87,16 @@ function getAttachListener(): android.view.View.OnAttachStateChangeListener {
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 {
public _originalBackground: any;
private _android: AndroidFrame;
@ -264,13 +274,28 @@ export class Frame extends FrameBase {
!this._currentEntry.fragment.isAdded()) {
return;
}
const fragmentManager: androidx.fragment.app.FragmentManager = this._getFragmentManager();
const manager: androidx.fragment.app.FragmentManager = this._getFragmentManager();
const transaction = manager.beginTransaction();
// Check if manager contains the fragment to be removed
// This might happen when a dialog is already closed with android back btn
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();
// 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) {
fragmentExitTransition.setResetOnTransitionEnd(true);
}

View File

@ -6,8 +6,6 @@ import {
export { ios };
export * from "./utils-common";
let mainScreenScale;
export function openFile(filePath: string): boolean {
try {
const appPath = ios.getCurrentAppPath();
@ -47,5 +45,3 @@ export function openUrl(location: string): boolean {
return false;
}
mainScreenScale = UIScreen.mainScreen.scale;