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;
          })
      }
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%')
    }
  }
}        

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识别
1146浏览 • 1回复 待解决
组件状态修改build渲染机制
1365浏览 • 1回复 待解决
HarmonyOS endable对象属性napi无法修改
338浏览 • 1回复 待解决
HarmonyOS 是否支持对象属性进行修改
301浏览 • 1回复 待解决