Skip to content

Commit fdbe33d

Browse files
author
farfromrefuge
committed
fix: notify of disposing on disposeNativeView so that flavours can destroy their instances
1 parent 8f136be commit fdbe33d

File tree

4 files changed

+26
-17
lines changed

4 files changed

+26
-17
lines changed

src/ui-pager/index.android.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,12 @@ export class Pager extends PagerBase {
268268
disposeViewHolderViews() {
269269
this.enumerateViewHolders((v) => {
270270
const view = v.view;
271+
this.notify({
272+
eventName: Pager.itemDisposingEvent,
273+
index: v.getAdapterPosition(),
274+
android: v,
275+
view
276+
} as ItemEventData);
271277
// if (view && view.isLoaded) {
272278
// view.callUnloaded();
273279
// }

src/ui-pager/index.ios.ts

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -505,11 +505,10 @@ export class Pager extends PagerBase {
505505
}
506506

507507
private clearRealizedCells() {
508-
const that = new WeakRef<Pager>(this);
509-
this.mMap.forEach(function (value, key: PagerCell) {
510-
that.get()._removeContainer(key);
511-
that.get()._clearCellViews(key);
512-
}, that);
508+
this.mMap.forEach((value, key: PagerCell) => {
509+
this._removeContainer(key);
510+
this._clearCellViews(key);
511+
});
513512
this.mMap.clear();
514513
}
515514
private _clearCellViews(cell: PagerCell) {
@@ -560,18 +559,14 @@ export class Pager extends PagerBase {
560559
}
561560

562561
public _removeContainer(cell: PagerCell, index?: number): void {
563-
let view = cell.view;
562+
const view = cell.view;
564563

565-
const args = {
564+
this.notify({
566565
eventName: Pager.itemDisposingEvent,
567-
object: this,
568566
index,
569-
android: undefined,
570567
ios: cell,
571568
view
572-
} as ItemEventData;
573-
this.notify(args);
574-
view = args.view;
569+
} as ItemEventData);
575570
if (view && view.parent) {
576571
// This is to clear the StackLayout that is used to wrap ProxyViewContainer instances.
577572
if (!(view.parent instanceof Pager)) {

src/ui-pager/svelte/index.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ export default class PagerViewElement extends NativeViewElementNode<Pager> {
5454
const nativeView = this.nativeView;
5555
nativeView.itemViewLoader = (viewType: any): View => this.loadView(viewType);
5656
this.nativeView.on(Pager.itemLoadingEvent, this.updateListItem, this);
57+
this.nativeView.on(Pager.itemDisposingEvent, this.disposeListItem, this);
5758
}
5859

5960
private loadView(viewType: string): View {
@@ -118,6 +119,13 @@ export default class PagerViewElement extends NativeViewElementNode<Pager> {
118119
}
119120
}
120121
}
122+
private disposeListItem(args: ItemEventData) {
123+
const _view = args.view;
124+
if (_view.__SvelteComponent__) {
125+
_view.__SvelteComponent__.$destroy();
126+
_view.__SvelteComponent__ = null;
127+
}
128+
}
121129
private updateListItem(args: ItemEventData & { bindingContext }) {
122130
const _view = args.view;
123131
const props = { item: args.bindingContext, index: args.index };

src/ui-pager/vue/pager.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -93,11 +93,11 @@ export default {
9393
},
9494
onItemDisposing(args) {
9595
// TODO: handle disposing template
96-
// const oldVnode = args.view && args.view[ VUE_VIEW ];
97-
// console.log("disposing", !!oldVnode, VUE_VIEW);
98-
// if (oldVnode) {
99-
// Vue.prototype.__patch__(oldVnode, null);
100-
// }
96+
const oldVnode = args.view && args.view[VUE_VIEW];
97+
if (oldVnode) {
98+
// properly dispose the oldVnode (this will unmount the tree)
99+
this.__patch__(oldVnode, null);
100+
}
101101
},
102102
onSelectedIndexChange({ value }) {
103103
this.$emit('selectedIndexChange', {

0 commit comments

Comments
 (0)