HarmonyOS ObjectLink 修改类属性后build未被执行

ObjectLink 修改类的嵌套属性后build未被执行

修改ObjectLink 嵌套类的属性build不执行,想要一个可以定位原因排查问题的技术方案

Column(){
  if(this.insuranceModel.hasScrollModule){
    List() {
      ForEach(this.insuranceModel.insureObjList, (item: InsureObj, index: number) => {
        ListItem(){
          if(item.scroll) {
            this.renderInsureItem(item, index)
          }
        }
      })
    }
    @Builder renderInsureItem(item: InsureObj, index: number){
      Column() {
        Image(item.productIcon)
          .width(36)
          .height(36)
          .margin({ top: 6 })
        Row(){
          Text(item.showTitle)
            .fontColor('#333333')
            .fontSize(14)
            .fontWeight(500)
          if(!item.emptyInsCard){
            Text(FIconFont.otaInfo)
              .fontFamily(FIconFont.iconFontFamily)
              .fontColor('#333333')
              .fontSize(16)
              .margin({left: 2})
          }
        }
        .margin({ top: 2 })
        Column(){
          this.priceView(item)
        }
        DashLine({widthValue: 98})
          .margin({bottom:6})
        Column() {
          this.descListView(item)
        }
        Text(item.isSelected ? FIconFont.checked : FIconFont.unCheck)
          .fontColor(item.isSelected ? this.checkedColor : this.unCheckColor)
          .fontFamily(FIconFont.iconFontFamily)
          .fontSize(20)
          .lineHeight(24)
          .margin({top: item.emptyInsCard ? 14 : 10})
          .onClick(() => {
            item.isSelected = !item.isSelected;
          })
      }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
HarmonyOS
2024-12-28 08:49:25
浏览
收藏 0
回答 1
回答 1
按赞同
/
按时间
aquaa

在自定义构建函数中,不允许改变参数值,同时按照值传递时,状态变量的改变不会引起@builder方法内的UI刷新,文档中有说明:

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-builder-V5

基于你需要的场景,调整你的代码如下:

import { Data, PassengerItem } from '../bean';

@Component
struct PassengerCard {
  @ObjectLink passengerItem: PassengerItem;
  build() {
    Row(){
      Text(this.passengerItem?.name)
        .fontSize(16)
      Text(this.passengerItem.isSelected?'选中':'未选中')
        .margin({left:10})
        .onClick(() => {
          this.passengerItem.isSelected = !this.passengerItem.isSelected
        })
    }
    .width('100%')
    .height(25)
  }
}
@Component
export struct PassengerCards{
  @ObjectLink data:Data;
  build(){
    if(this.data.passengers){
      Column(){
        List(){
          ForEach(this.data.passengers, (passenger: PassengerItem, index: number) => {
            ListItem() {
              PassengerCard({passengerItem: passenger})
            }
          })
        }
        .width('100%')
        .height('100%')
      }
      .width('100%')
      .height('100%')
    }
  }
}        
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.

objectLink使用方式及场景文档请参考:

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-observed-and-objectlink-V5

1、调试工具:当前IDE是支持相关功能调试的,但是由于当前harmonyOS SDK暂不开源,所以调试时系统部分为黑盒。

2、该UI刷新问题本身:

(1)在自定义构建函数中,不允许改变参数值,同时按照值传递时,状态变量的改变不会引起@builder方法内的UI刷新。

(2)Objectlink修饰的对象赋值会导致双向绑定关系失效,导致UI无法刷新。

分享
微博
QQ
微信
回复
2024-12-28 11:50:41
相关问题
修改module名字后,module未被IDE识别
1463浏览 • 1回复 待解决
组件状态修改build渲染机制
1885浏览 • 1回复 待解决
HarmonyOS 是否支持对象属性进行修改
657浏览 • 1回复 待解决
HarmonyOS endable对象属性napi无法修改
715浏览 • 1回复 待解决