HarmonyOS 鸿蒙Next BuildParam 传递的构建函数,数据变化不会引起UI更新

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

HarmonyOS 鸿蒙Next BuildParam 传递的构建函数,数据变化不会引起UI更新

@Component
export struct IntegralChannelDialog {
  // 监听外部传入的visible变量,visible值发生变化时触发onChange回调函数
  @Link @Watch("onChange") visible: boolean
  onCancel?: () => void;
  onConfirm?: () => void;
  @Prop @Watch("dataChange")
  dialogContent: IntegralDialogContent
  // 通过CustomDialogController的builder参数绑定弹窗组件MyCustomDialog
  private controller = new CustomDialogController({
    builder: BaseCustomDialog({
      visible: $visible,
      onCancel: this.onCancel,
      onConfirm: this.onConfirm,
      content: this.content
    }),
    cancel: () => {
      this.visible = false
    },
    alignment: DialogAlignment.Center,
    backgroundColor: $r('app.color.xxx'),
    cornerRadius: '10vp'
  })

  dataChange() {
    ExLogger.i("NormalDialog", JSON.stringify(this.dialogContent))
  }

  // visible的值发生变化时触发,若visible最新值为true通过弹窗控制器打开弹窗,否则关闭弹窗
  onChange() {
    if (this.visible) {
      this.controller.open()
    } else {
      this.controller.close()
    }
  }

  build() {

  }

  @Builder
  content(): void {
    IntegralTip({
      title: this.dialogContent?.title,
      list: [],
      total: this.dialogContent?.total
    })
  }
}

@CustomDialog
export struct BaseCustomDialog {
  @Link visible: boolean;
  // 被@CustomDialog装饰器修饰的组件必须持有CustomDialogController类型属性参数
  controller: CustomDialogController;
  // 弹窗交互事件参数,点击确认和取消按钮时的回调函数
  onCancel?: () => void;
  onConfirm?: () => void;
  @BuilderParam
  content: () => void

  build() {
    Column({ space: 12 }) {
      this.content?.()
    }
    .height(AUTO)
  }
}

dataChange()方法能监听到数据类的变化 ,但是ui并不会更新


更多关于HarmonyOS 鸿蒙Next BuildParam 传递的构建函数,数据变化不会引起UI更新的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

由于Demo不够完整,有部分对象、方法没有提供,导致无法进行运行复现,麻烦提供一个可运行复现的版本;

目前在您代码中存在[@BuilderParam](/user/BuilderParam)装饰器this指向问题,content: this.content 传参时this指向的是BaseCustomDialog,而不是IntegralChannelDialog,可使用箭头函数进行传递即:content: ():void=>{this.content }

参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-builderparam-V5#初始化builderparam装饰的方法  

可参考文档中的【需要注意this的指向】说明以及示例

更多关于HarmonyOS 鸿蒙Next BuildParam 传递的构建函数,数据变化不会引起UI更新的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


应该是this的指向问题导致的

深色代码主题
复制
private controller = new CustomDialogController({
  builder: BaseCustomDialog({
    visible: $visible,
    onCancel: this.onCancel,
    onConfirm: this.onConfirm,
    content: this.content.bind(this)
}),

传递时增加了bind(this)

在HarmonyOS(鸿蒙)系统中,Next BuildParam 传递的构建函数通常用于定义UI组件的更新逻辑。如果数据变化没有引起UI更新,这通常意味着数据绑定机制没有正确实现或者状态管理没有生效。

在鸿蒙开发中,UI组件的更新依赖于数据的实时性。当数据发生变化时,如果通过正确的数据绑定机制,UI组件应该能够感知到这种变化并自动更新。如果数据变化没有触发UI更新,首先需要检查数据绑定的实现方式。确保数据的变化是通过Observable对象或者具有通知机制的类进行管理的。

此外,检查构建函数中是否有条件渲染逻辑,这些逻辑可能阻止了UI的更新。确保条件判断是基于正确的数据状态。

还需要注意的是,鸿蒙系统有自己的生命周期管理机制。在某些情况下,如果组件的生命周期状态不允许更新(例如,组件已经销毁),那么即使数据发生变化,UI也不会更新。

最后,检查是否有异步操作或者延迟更新的逻辑,这些可能导致数据变化在UI更新前被忽略。

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

回到顶部