HarmonyOS鸿蒙Next中@Builder支持传递@Observed修饰的对象吗,对象变化,内部UI也变化吗

HarmonyOS鸿蒙Next中@Builder支持传递@Observed修饰的对象吗,对象变化,内部UI也变化吗

[@Builder](/user/Builder)
testListItem(item: TestInfo) {
}

外部调用

this.testListItem(this.testInfo)

修改this.testInfo,不能引起UI变化

4 回复

你好,@Builder 需要在包一层,改为传递字面量对象,才能响应。参考[@Builder参数传递规则](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-builder#按引用传递参数)

  • 只有当传入一个参数且该参数直接传入对象字面量时,才会按引用传递,其他传递方式均为按值传递。
interface ItemWrap {
  item: TestInfo
}

[@Builder](/user/Builder)
testListItem(itemWrap: ItemWrap) {
}

this.testListItem({item: this.itemInfo})

更多关于HarmonyOS鸿蒙Next中@Builder支持传递@Observed修饰的对象吗,对象变化,内部UI也变化吗的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


builder参数想响应不管传啥都得用字面量对象再包一层,很容易踩坑😂

在HarmonyOS Next中,@Builder支持传递@Observed修饰的对象。当传递的对象属性发生变化时,使用该对象的@Builder内部UI会自动更新。这是通过ArkUI的响应式UI机制实现的,确保数据与视图同步。

在HarmonyOS Next中,[@Builder](/user/Builder)装饰器支持传递[@Observed](/user/Observed)修饰的对象。当传递的对象属性发生变化时,如果UI中绑定了这些属性,那么UI会自动更新。

根据你的代码示例,问题可能在于调用方式或对象属性的绑定方式。以下是关键点:

  1. [@Observed](/user/Observed)类定义:确保TestInfo类已正确使用[@Observed](/user/Observed)装饰,且其需要监听的属性使用@Track装饰(或在ArkTS中,[@Observed](/user/Observed)类的属性默认可观察,但对象属性需为简单类型或也用[@Observed](/user/Observed)修饰)。

    [@Observed](/user/Observed)
    class TestInfo {
      @Track name: string = '';
      // 或直接声明可观察属性
    }
    
  2. [@Builder](/user/Builder)内使用属性:在[@Builder](/user/Builder)函数内部,必须直接绑定对象的具体属性到UI,而不是整个对象。例如:

    [@Builder](/user/Builder)
    testListItem(item: TestInfo) {
      Text(item.name) // 绑定具体属性
        .fontSize(20)
    }
    

    这样,当item.name变化时,Text组件会更新。

  3. 修改对象属性:确保修改的是对象属性(如this.testInfo.name = '新值'),而不是替换整个对象(如this.testInfo = new TestInfo())。如果替换整个对象,[@Builder](/user/Builder)不会感知变化,因为其引用未在调用处重新执行。

  4. 调用方式:在UI中使用[@Builder](/user/Builder)时,直接调用即可,例如:

    this.testListItem(this.testInfo)
    

    但需确保this.testInfo@State@Link@Provide等装饰的响应式变量,以保证对象引用变化时UI刷新。

总结:[@Builder](/user/Builder)支持[@Observed](/user/Observed)对象,UI更新取决于属性绑定方式。修改对象属性后,若UI未变化,请检查属性是否用@Track装饰、是否绑定具体属性,以及对象是否为响应式变量。

回到顶部