From 18b911ed84173928d1d0cfc91be605e046a7e3d1 Mon Sep 17 00:00:00 2001 From: Nathan Walker Date: Mon, 16 Jan 2023 11:41:04 -0800 Subject: [PATCH] fix(core): improve loaded/unloaded handling --- packages/core/ui/action-bar/index.android.ts | 4 +++- packages/core/ui/button/index.android.ts | 2 +- packages/core/ui/core/view/index.android.ts | 7 +++++-- packages/core/ui/date-picker/index.android.ts | 4 +++- packages/core/ui/image/index.android.ts | 4 +++- packages/core/ui/image/index.ios.ts | 3 +-- .../ui/layouts/root-layout/index.android.ts | 18 ++++++++++-------- packages/core/ui/list-picker/index.android.ts | 8 ++++++-- packages/core/ui/list-view/index.android.ts | 8 ++++++-- packages/core/ui/scroll-view/index.android.ts | 2 +- packages/core/ui/scroll-view/index.ios.ts | 1 + packages/core/ui/search-bar/index.android.ts | 8 ++++++-- .../core/ui/segmented-bar/index.android.ts | 4 +++- packages/core/ui/switch/index.android.ts | 4 +++- packages/core/ui/tab-view/index.android.ts | 2 +- packages/core/ui/web-view/index.android.ts | 4 +++- packages/core/ui/web-view/index.ios.ts | 2 +- 17 files changed, 57 insertions(+), 28 deletions(-) diff --git a/packages/core/ui/action-bar/index.android.ts b/packages/core/ui/action-bar/index.android.ts index 7cb7b7ace..9b4126886 100644 --- a/packages/core/ui/action-bar/index.android.ts +++ b/packages/core/ui/action-bar/index.android.ts @@ -177,7 +177,9 @@ export class ActionBar extends ActionBarBase { } public disposeNativeView() { - (this.nativeViewProtected).menuItemClickListener.owner = null; + if ((this.nativeViewProtected)?.menuItemClickListener) { + (this.nativeViewProtected).menuItemClickListener.owner = null; + } super.disposeNativeView(); } diff --git a/packages/core/ui/button/index.android.ts b/packages/core/ui/button/index.android.ts index 4099c24a8..097efc734 100644 --- a/packages/core/ui/button/index.android.ts +++ b/packages/core/ui/button/index.android.ts @@ -95,7 +95,7 @@ export class Button extends ButtonBase { } public disposeNativeView() { - if (this.nativeViewProtected) { + if ((this.nativeViewProtected)?.clickListener) { (this.nativeViewProtected).clickListener.owner = null; } super.disposeNativeView(); diff --git a/packages/core/ui/core/view/index.android.ts b/packages/core/ui/core/view/index.android.ts index 9b785bac6..af560c101 100644 --- a/packages/core/ui/core/view/index.android.ts +++ b/packages/core/ui/core/view/index.android.ts @@ -476,7 +476,6 @@ export class View extends ViewCommon { } public disposeNativeView(): void { - super.disposeNativeView(); if (this.touchListenerIsSet) { this.touchListenerIsSet = false; if (this.nativeViewProtected) { @@ -485,8 +484,12 @@ export class View extends ViewCommon { } if (this.layoutChangeListenerIsSet) { this.layoutChangeListenerIsSet = false; - this.nativeViewProtected.removeOnLayoutChangeListener(this.layoutChangeListener); + if (this.nativeViewProtected) { + this.nativeViewProtected.removeOnLayoutChangeListener(this.layoutChangeListener); + this.layoutChangeListener = null; + } } + super.disposeNativeView(); } setOnTouchListener() { diff --git a/packages/core/ui/date-picker/index.android.ts b/packages/core/ui/date-picker/index.android.ts index c0bed9e73..a90073fce 100644 --- a/packages/core/ui/date-picker/index.android.ts +++ b/packages/core/ui/date-picker/index.android.ts @@ -91,7 +91,9 @@ export class DatePicker extends DatePickerBase { if (this.timePicker) { this.timePicker.disposeNativeView(); } - (this.nativeViewProtected).listener.owner = null; + if ((this.nativeViewProtected)?.listener) { + (this.nativeViewProtected).listener.owner = null; + } super.disposeNativeView(); } diff --git a/packages/core/ui/image/index.android.ts b/packages/core/ui/image/index.android.ts index 744ada369..657dcb56f 100644 --- a/packages/core/ui/image/index.android.ts +++ b/packages/core/ui/image/index.android.ts @@ -67,7 +67,9 @@ export class Image extends ImageBase { } public disposeNativeView() { - (this.nativeViewProtected).listener.owner = null; + if ((this.nativeViewProtected)?.listener) { + (this.nativeViewProtected).listener.owner = null; + } super.disposeNativeView(); } diff --git a/packages/core/ui/image/index.ios.ts b/packages/core/ui/image/index.ios.ts index 60ed14575..49e0675a2 100644 --- a/packages/core/ui/image/index.ios.ts +++ b/packages/core/ui/image/index.ios.ts @@ -39,13 +39,12 @@ export class Image extends ImageBase { } public disposeNativeView(): void { - super.disposeNativeView(); - if (this.nativeViewProtected?.image) { this.nativeViewProtected.image = null; } this.disposeImageSource(); + super.disposeNativeView(); } private setTintColor(value: Color) { diff --git a/packages/core/ui/layouts/root-layout/index.android.ts b/packages/core/ui/layouts/root-layout/index.android.ts index fbb87988c..e043f57fd 100644 --- a/packages/core/ui/layouts/root-layout/index.android.ts +++ b/packages/core/ui/layouts/root-layout/index.android.ts @@ -16,17 +16,19 @@ export class RootLayout extends RootLayoutBase { super.insertChild(view, atIndex); if (!view.hasGestureObservers()) { // block tap events from going through to layers behind the view - view.nativeViewProtected.setOnTouchListener( - new android.view.View.OnTouchListener({ - onTouch: function (view, event) { - return true; - }, - }) - ); + if (view.nativeViewProtected) { + view.nativeViewProtected.setOnTouchListener( + new android.view.View.OnTouchListener({ + onTouch: function (view, event) { + return true; + }, + }) + ); + } } } removeChild(view: View): void { - if (view.hasGestureObservers()) { + if (view.hasGestureObservers() && view.nativeViewProtected) { view.nativeViewProtected.setOnTouchListener(null); } super.removeChild(view); diff --git a/packages/core/ui/list-picker/index.android.ts b/packages/core/ui/list-picker/index.android.ts index 8313fb418..cd4332d42 100644 --- a/packages/core/ui/list-picker/index.android.ts +++ b/packages/core/ui/list-picker/index.android.ts @@ -131,8 +131,12 @@ export class ListPicker extends ListPickerBase { public disposeNativeView() { const nativeView = this.nativeViewProtected; - (nativeView).formatter.owner = null; - (nativeView).valueChangedListener.owner = null; + if ((nativeView)?.formatter) { + (nativeView).formatter.owner = null; + } + if ((nativeView)?.valueChangedListener) { + (nativeView).valueChangedListener.owner = null; + } super.disposeNativeView(); } diff --git a/packages/core/ui/list-view/index.android.ts b/packages/core/ui/list-view/index.android.ts index 4da3a07b4..bd48a8a7c 100644 --- a/packages/core/ui/list-view/index.android.ts +++ b/packages/core/ui/list-view/index.android.ts @@ -153,8 +153,12 @@ export class ListView extends ListViewBase { public disposeNativeView() { const nativeView = this.nativeViewProtected; nativeView.setAdapter(null); - (nativeView).itemClickListener.owner = null; - (nativeView).adapter.owner = null; + if ((nativeView).itemClickListener) { + (nativeView).itemClickListener.owner = null; + } + if ((nativeView).adapter) { + (nativeView).adapter.owner = null; + } this.clearRealizedCells(); super.disposeNativeView(); } diff --git a/packages/core/ui/scroll-view/index.android.ts b/packages/core/ui/scroll-view/index.android.ts index 9d798ed61..7bcf6876d 100644 --- a/packages/core/ui/scroll-view/index.android.ts +++ b/packages/core/ui/scroll-view/index.android.ts @@ -166,8 +166,8 @@ export class ScrollView extends ScrollViewBase { } disposeNativeView() { - super.disposeNativeView(); this.removeNativeListener(); + super.disposeNativeView(); } public _onOrientationChanged() { diff --git a/packages/core/ui/scroll-view/index.ios.ts b/packages/core/ui/scroll-view/index.ios.ts index 9b8c48cd7..95ef2cb7c 100644 --- a/packages/core/ui/scroll-view/index.ios.ts +++ b/packages/core/ui/scroll-view/index.ios.ts @@ -50,6 +50,7 @@ export class ScrollView extends ScrollViewBase { } disposeNativeView() { + this.removeNativeListener(); this._delegate = null; super.disposeNativeView(); } diff --git a/packages/core/ui/search-bar/index.android.ts b/packages/core/ui/search-bar/index.android.ts index 8a2cdd383..dead0caf6 100644 --- a/packages/core/ui/search-bar/index.android.ts +++ b/packages/core/ui/search-bar/index.android.ts @@ -150,8 +150,12 @@ export class SearchBar extends SearchBarBase { public disposeNativeView() { const nativeView: any = this.nativeViewProtected; - nativeView.closeListener.owner = null; - nativeView.queryTextListener.owner = null; + if (nativeView.closeListener) { + nativeView.closeListener.owner = null; + } + if (nativeView.queryTextListener) { + nativeView.queryTextListener.owner = null; + } this._searchPlate = null; this._searchTextView = null; super.disposeNativeView(); diff --git a/packages/core/ui/segmented-bar/index.android.ts b/packages/core/ui/segmented-bar/index.android.ts index bc0588330..fda7afcf0 100644 --- a/packages/core/ui/segmented-bar/index.android.ts +++ b/packages/core/ui/segmented-bar/index.android.ts @@ -238,7 +238,9 @@ export class SegmentedBar extends SegmentedBarBase { public disposeNativeView() { const nativeView: any = this.nativeViewProtected; - nativeView.listener.owner = null; + if (nativeView?.listener) { + nativeView.listener.owner = null; + } super.disposeNativeView(); } diff --git a/packages/core/ui/switch/index.android.ts b/packages/core/ui/switch/index.android.ts index bcf2805b5..1f9670a66 100644 --- a/packages/core/ui/switch/index.android.ts +++ b/packages/core/ui/switch/index.android.ts @@ -52,7 +52,9 @@ export class Switch extends SwitchBase { public disposeNativeView() { const nativeView: any = this.nativeViewProtected; - nativeView.listener.owner = null; + if (nativeView.listener) { + nativeView.listener.owner = null; + } super.disposeNativeView(); } diff --git a/packages/core/ui/tab-view/index.android.ts b/packages/core/ui/tab-view/index.android.ts index 9c012d760..d25cf0828 100644 --- a/packages/core/ui/tab-view/index.android.ts +++ b/packages/core/ui/tab-view/index.android.ts @@ -350,8 +350,8 @@ export class TabViewItem extends TabViewItemBase { } public disposeNativeView(): void { - super.disposeNativeView(); (this).canBeLoaded = false; + super.disposeNativeView(); } public createNativeView() { diff --git a/packages/core/ui/web-view/index.android.ts b/packages/core/ui/web-view/index.android.ts index b302d837d..ea1617fe4 100644 --- a/packages/core/ui/web-view/index.android.ts +++ b/packages/core/ui/web-view/index.android.ts @@ -123,10 +123,12 @@ export class WebView extends WebViewBase { public disposeNativeView() { const nativeView = this.nativeViewProtected; if (nativeView) { + if ((nativeView).client) { + (nativeView).client.owner = null; + } nativeView.destroy(); } - (nativeView).client.owner = null; super.disposeNativeView(); } diff --git a/packages/core/ui/web-view/index.ios.ts b/packages/core/ui/web-view/index.ios.ts index 5c7baf75a..9e8f4acc2 100644 --- a/packages/core/ui/web-view/index.ios.ts +++ b/packages/core/ui/web-view/index.ios.ts @@ -208,10 +208,10 @@ export class WebView extends WebViewBase { } disposeNativeView() { - super.disposeNativeView(); this._delegate = null; this._scrollDelegate = null; this._uiDelegate = null; + super.disposeNativeView(); } // @ts-ignore