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);
}
nativeRender(model) {
if (this.context) {
this.context.shader.render(model);
}
this.context.shader.render(model);
}
hookBeforeNativeCall() {
this.__root__.clean();
@ -745,16 +743,32 @@ class Panel {
}
hookAfterNativeCall() {
//Here insert a native call to ensure the promise is resolved done.
nativeEmpty();
if (this.__root__.isDirty()) {
const model = this.__root__.toModel();
this.nativeRender(model);
if (Environment.platform === 'h5') {
setTimeout(() => {
if (this.__root__.isDirty()) {
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()) {
if (v.isDirty()) {
const model = v.toModel();
else {
nativeEmpty();
if (this.__root__.isDirty()) {
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);
}
}
}
}
}

View File

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

View File

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

View File

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