HarmonyOS 鸿蒙Next @Builder装饰器 不刷新ui问题

HarmonyOS 鸿蒙Next @Builder装饰器 不刷新ui问题

生命 @Builder 装饰器后,按引用传参的方式进行使用

如果直接在组件中使用,状态变化可以刷新UI;

但是如果通过 dialog 的方式进行使用,则不能刷新 UI ,这是为什么呢?

import { ComponentContent } from "@kit.ArkUI";

@Entry
@ComponentV2
struct Index {
  @Local
  params: DialogParams = new DialogParams(10)

  build() {
    Column() {
      Text(`change num=${this.params.num}`)
        .fontSize(30)
        .onClick(() => {
          this.params.num++ //刷新ui
        })
      dialogBuilder(this.params) //刷新ui
      dialogBuilder1(this.params) //刷新ui

      Text("showDialog")
        .fontSize(30)
        .onClick(() => {
          let uiContext = this.getUIContext();
          let promptAction = uiContext.getPromptAction();
          let commentsDialog = new ComponentContent(
            uiContext,
            wrapBuilder(dialogBuilder),
            this.params  //不刷新ui
          );
          promptAction.openCustomDialog(commentsDialog, {
            alignment: DialogAlignment.Center
          });
        })
    }
    .height('100%')
    .width('100%')
  }
}

@ObservedV2
class DialogParams {
  @Trace
  num: number = 0

  constructor(num: number) {
    this.num = num;
  }
}

[@Builder](/user/Builder)
function dialogBuilder($$: DialogParams) {
  Column() {
    Text(`change builder num=${$$.num}`)
      .fontSize(30)
      .padding(10)
      .onClick(() => {
        $$.num++
      })
  }
}

[@Builder](/user/Builder)
function dialogBuilder1(params: DialogParams) {
  Column() {
    Text(`change builder num=${params.num}`)
      .fontSize(30)
      .padding(10)
      .onClick(() => {
        params.num++
      })
  }
}


更多关于HarmonyOS 鸿蒙Next @Builder装饰器 不刷新ui问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

5 回复
您好,已经提单转内部分析,有结论,同步给您

更多关于HarmonyOS 鸿蒙Next @Builder装饰器 不刷新ui问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


后来我把状态管理都封装到自定义组件中,然后弹框的UI可以更新了,我理解的是状态管理的那些注解一定需要在 @ComponentV2 注解下的组件中才能生效,但是dialog用的是 @Builder 注解,而且 @Builder 不能跟 @ComponentV2 共存,所以弹框的UI不更新,但是封装成自定义组件后在弹框中使用就能更新了,因为自定义组件可以添加 @ComponentV2 注解

目测可能是个bug,通过wrapBuilder将值传到弹框后,页面text不能刷新,但是引用又传到弹窗中,导致父组件数据发生变化。

父组件数据变化,父组件ui可以刷新; 把引用传到弹框,在弹框中改变数据,父组件ui也会变化,但是弹框的ui没有变化。 我昨天看了一天文档,还一直以为是我的使用方式不对,这不是坑爹吗

针对HarmonyOS 鸿蒙Next中@Builder装饰器不刷新UI的问题,这通常是由于状态管理或参数传递方式不当导致的。以下是一些可能的原因及解决方案:

  1. 按值传递参数:在@Builder装饰器修饰的内部组件中,如果按值传递参数,当参数发生改变时,UI可能不会刷新。解决方案是按引用传值,确保参数变化能够触发UI更新。
  2. 状态变量未正确管理:如果状态变量未使用@State@Prop@Link等装饰器修饰,或者修饰方式不正确,也可能导致UI不刷新。请检查并确保所有需要刷新的状态变量都已正确修饰。
  3. 组件嵌套问题:在复杂的组件嵌套结构中,如果内部组件的状态变化未能正确传递到外部组件,也可能导致UI不刷新。请检查组件间的参数传递和状态更新逻辑。

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

回到顶部