HarmonyOS 鸿蒙Next build() 和 onDidBuild()的调用时机问题

发布于 1周前 作者 gougou168 最后一次编辑是 5天前 来自 鸿蒙OS

HarmonyOS 鸿蒙Next build() 和 onDidBuild()的调用时机问题

问下大佬们,onDidBuild()被调用的时候,是代表build()已经执行完成了吗?为什么我代码里在onDidBuild()中调用页面中Canvas对象的相关api并不能显示出来任何东西呢?
如果调用onDidBuild()方法的时候,仅仅是代表build()开始执行了,那么有什么方式可以让我知道build()中的组件已经渲染完毕了呢?
(ps:我是使用场景是因为有数据在aboutToAppear()方法中获取,然后根据这个数据来初始化Canvas()中的图形)
以下是部分代码:

private settings: RenderingContextSettings = new RenderingContextSettings(true)
private canvasContext2D: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)

@Component
export struct GuitarChordPage {
    build() {
        Column({ space: 25 }) {
            // Canvas START
            Canvas(this.canvasContext2D)
                .id('chordCanvas')
                .width(this.canvasWidth)
                .height(this.canvasHeight)
                .backgroundColor('#0798b3')
                .onReady(() => {
                // init初始背景
            })
        }.width('100%').align(Alignment.Center)
    }
    onDidBuild() {
        let ctx = this.canvasContext2D
        ctx.beginPath()
        ctx.fillStyle = '#ff00ff'
        ctx.arc(48, 88, RADIUS, START_ANGLE, END_ANGLE)
        ctx.fill()
        // 实际并没有画出这个圆,而我在另一个onClick事件中写了同样的代码就可以画出来
    }
}

开发环境:DevEco Studio NEXT Release(Build Version: 5.0.3.906)

运行环境:虚拟机 & 真机

3 回复

onDidBuild函数在执行自定义组件的build()函数之后执行。不建议在onDidBuild函数中更改状态变量、使用animateTo等功能,这可能会导致不稳定的UI表现。

点击事件可以画出来是因为触发了重新渲染

可以参考下页面的生命周期和重新渲染的参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-page-custom-components-lifecycle-V5#%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BB%84%E4%BB%B6%E7%9A%84%E5%88%9B%E5%BB%BA%E5%92%8C%E6%B8%B2%E6%9F%93%E6%B5%81%E7%A8%8B

但是Canvas的绘制并不需要更改状态变量,而是调用的Canvas的api来进行绘制的

关于HarmonyOS 鸿蒙Next中build()和onDidBuild()的调用时机问题,以下提供专业解答:

在HarmonyOS的组件生命周期中,build()方法用于构建组件的视图,当组件被创建或需要更新视图时会调用此方法。而onDidBuild()方法则是在build()函数执行完成以后被回调,此时组件的视图已经构建完成且已经准备好显示,但尚未进入舞台(即屏幕)进行渲染。

这种设计允许开发者在onDidBuild()中进行一些后构建操作,如设置动画的初始状态、对视图进行微调等。但需要注意的是,不建议在onDidBuild()中更改状态变量或使用animateTo等功能,因为这可能会导致不稳定的UI表现。

简而言之,build()方法负责构建组件的视图,而onDidBuild()方法则在视图构建完成后进行后续操作。两者在组件的生命周期中扮演着不同的角色。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部