fix: Page and Frame isLoaded undefined checks (#6255)

* fix(view): isLoaded handling

closes https://github.com/NativeScript/NativeScript/issues/6179

* refactor: Error handling code in onCreateView
This commit is contained in:
Alexander Vakrilov
2018-09-13 16:51:49 +03:00
committed by vakrilov
parent 8575c60b13
commit 12fade7155
4 changed files with 23 additions and 8 deletions

View File

@ -595,13 +595,13 @@ export abstract class ViewBase extends Observable implements ViewBaseDefinition
}
public loadView(view: ViewBase): void {
if (!view.isLoaded) {
if (view && !view.isLoaded) {
view.callLoaded();
}
}
public unloadView(view: ViewBase): void {
if (view.isLoaded) {
if (view && view.isLoaded) {
view.callUnloaded();
}
}

View File

@ -180,7 +180,7 @@ function initializeDialogFragment() {
}
const owner = this.owner;
if (!owner.isLoaded) {
if (owner && !owner.isLoaded) {
owner.callLoaded();
}
@ -196,7 +196,7 @@ function initializeDialogFragment() {
}
const owner = this.owner;
if (owner.isLoaded) {
if (owner && owner.isLoaded) {
owner.callUnloaded();
}
}

View File

@ -9,7 +9,7 @@ import { Page } from "../page";
import * as application from "../../application";
import {
FrameBase, stack, goBack, View, Observable,
traceEnabled, traceWrite, traceCategories
traceEnabled, traceWrite, traceCategories, traceError
} from "./frame-common";
import {
@ -696,8 +696,23 @@ class FragmentCallbacksImplementation implements AndroidFragmentCallbacks {
}
const entry = this.entry;
if (!entry) {
traceError(`${fragment}.onCreateView: entry is null or undefined`);
return null;
}
const page = entry.resolvedPage;
if (!page) {
traceError(`${fragment}.onCreateView: entry has no resolvedPage`);
return null;
}
const frame = this.frame;
if (!frame) {
traceError(`${fragment}.onCreateView: this.frame is null or undefined`);
return null;
}
if (page.parent === frame) {
// If we are navigating to a page that was destroyed
// reinitialize its UI.
@ -706,12 +721,12 @@ class FragmentCallbacksImplementation implements AndroidFragmentCallbacks {
page._setupUI(context);
}
} else {
if (!this.frame._styleScope) {
if (!frame._styleScope) {
// Make sure page will have styleScope even if parents don't.
page._updateStyleScope();
}
this.frame._addView(page);
frame._addView(page);
}
if (frame.isLoaded && !page.isLoaded) {

View File

@ -357,7 +357,7 @@ export class CssState {
* As a result, at some point in time, the selectors matched have to be requerried from the style scope and applied to the view.
*/
public onChange(): void {
if (this.view.isLoaded) {
if (this.view && this.view.isLoaded) {
this.unsubscribeFromDynamicUpdates();
this.updateMatch();
this.subscribeForDynamicUpdates();