feat:when in H5 environment,must set check dirty to next macro task loop incase the changing occured in promise.then function which is scheduled in micro task loop

This commit is contained in:
pengfei.zhou 2019-12-25 14:37:14 +08:00 committed by osborn
parent 9677207844
commit 4b1fcc439d
4 changed files with 75 additions and 33 deletions

View File

@ -733,9 +733,7 @@ class Panel {
}, undefined); }, undefined);
} }
nativeRender(model) { nativeRender(model) {
if (this.context) { this.context.shader.render(model);
this.context.shader.render(model);
}
} }
hookBeforeNativeCall() { hookBeforeNativeCall() {
this.__root__.clean(); this.__root__.clean();
@ -745,16 +743,32 @@ class Panel {
} }
hookAfterNativeCall() { hookAfterNativeCall() {
//Here insert a native call to ensure the promise is resolved done. //Here insert a native call to ensure the promise is resolved done.
nativeEmpty(); if (Environment.platform === 'h5') {
if (this.__root__.isDirty()) { setTimeout(() => {
const model = this.__root__.toModel(); if (this.__root__.isDirty()) {
this.nativeRender(model); const model = this.__root__.toModel();
this.nativeRender(model);
}
for (let v of this.headviews.values()) {
if (v.isDirty()) {
const model = v.toModel();
this.nativeRender(model);
}
}
}, 0);
} }
for (let v of this.headviews.values()) { else {
if (v.isDirty()) { nativeEmpty();
const model = v.toModel(); if (this.__root__.isDirty()) {
const model = this.__root__.toModel();
this.nativeRender(model); this.nativeRender(model);
} }
for (let v of this.headviews.values()) {
if (v.isDirty()) {
const model = v.toModel();
this.nativeRender(model);
}
}
} }
} }
} }

View File

@ -2181,9 +2181,7 @@ class Panel {
}, undefined); }, undefined);
} }
nativeRender(model) { nativeRender(model) {
if (this.context) { this.context.shader.render(model);
this.context.shader.render(model);
}
} }
hookBeforeNativeCall() { hookBeforeNativeCall() {
this.__root__.clean(); this.__root__.clean();
@ -2193,16 +2191,32 @@ class Panel {
} }
hookAfterNativeCall() { hookAfterNativeCall() {
//Here insert a native call to ensure the promise is resolved done. //Here insert a native call to ensure the promise is resolved done.
nativeEmpty(); if (Environment.platform === 'h5') {
if (this.__root__.isDirty()) { setTimeout(() => {
const model = this.__root__.toModel(); if (this.__root__.isDirty()) {
this.nativeRender(model); const model = this.__root__.toModel();
this.nativeRender(model);
}
for (let v of this.headviews.values()) {
if (v.isDirty()) {
const model = v.toModel();
this.nativeRender(model);
}
}
}, 0);
} }
for (let v of this.headviews.values()) { else {
if (v.isDirty()) { nativeEmpty();
const model = v.toModel(); if (this.__root__.isDirty()) {
const model = this.__root__.toModel();
this.nativeRender(model); this.nativeRender(model);
} }
for (let v of this.headviews.values()) {
if (v.isDirty()) {
const model = v.toModel();
this.nativeRender(model);
}
}
} }
} }
} }

View File

@ -20,7 +20,7 @@ export type BridgeContext = { [index: string]: { [index: string]: (args?: any) =
declare global { declare global {
const context: BridgeContext const context: BridgeContext
const Environment: { const Environment: {
platform: "Android" | "iOS" | "Qt", platform: "Android" | "iOS" | "Qt" | "h5",
platformVersion: string, platformVersion: string,

View File

@ -18,6 +18,7 @@ import { View, Group } from "./view"
import { loge } from '../util/log' import { loge } from '../util/log'
import { Model } from '../util/types' import { Model } from '../util/types'
import { Root } from '../widget/layouts' import { Root } from '../widget/layouts'
import { BridgeContext } from '../runtime/global'
export function NativeCall(target: Panel, propertyKey: string, descriptor: PropertyDescriptor) { export function NativeCall(target: Panel, propertyKey: string, descriptor: PropertyDescriptor) {
@ -34,7 +35,7 @@ type Frame = { width: number, height: number }
declare function nativeEmpty(): void declare function nativeEmpty(): void
export abstract class Panel { export abstract class Panel {
context?: any context!: BridgeContext
onCreate() { } onCreate() { }
onDestroy() { } onDestroy() { }
onShow() { } onShow() { }
@ -139,9 +140,7 @@ export abstract class Panel {
} }
private nativeRender(model: Model) { private nativeRender(model: Model) {
if (this.context) { this.context.shader.render(model)
this.context.shader.render(model)
}
} }
private hookBeforeNativeCall() { private hookBeforeNativeCall() {
@ -153,16 +152,31 @@ export abstract class Panel {
private hookAfterNativeCall() { private hookAfterNativeCall() {
//Here insert a native call to ensure the promise is resolved done. //Here insert a native call to ensure the promise is resolved done.
nativeEmpty() if (Environment.platform === 'h5') {
if (this.__root__.isDirty()) { setTimeout(() => {
const model = this.__root__.toModel() if (this.__root__.isDirty()) {
this.nativeRender(model) const model = this.__root__.toModel()
} this.nativeRender(model)
for (let v of this.headviews.values()) { }
if (v.isDirty()) { for (let v of this.headviews.values()) {
const model = v.toModel() if (v.isDirty()) {
const model = v.toModel()
this.nativeRender(model)
}
}
}, 0)
} else {
nativeEmpty()
if (this.__root__.isDirty()) {
const model = this.__root__.toModel()
this.nativeRender(model) this.nativeRender(model)
} }
for (let v of this.headviews.values()) {
if (v.isDirty()) {
const model = v.toModel()
this.nativeRender(model)
}
}
} }
} }