HarmonyOS 鸿蒙Next ForEach中Item对象属性变化,不会刷新UI

HarmonyOS 鸿蒙Next ForEach中Item对象属性变化,不会刷新UI 使用ForEach,Item对象属性改变时,UI不刷新,都加了@Observed也没啥用,请问这种情况该怎么写呢? 如下Demo

@Component
export struct TestView {
  @State tabInfo: TabInfo = TestData()

  build() {
    Column() {
      if (this.tabInfo.tabGroups) {
        ForEach(this.tabInfo.tabGroups, (group: TabGroup) => {
          Text("" + group.name)
          Flex({ wrap: FlexWrap.Wrap }) {
            ForEach(group.tabs, (item: TabItem) => {
              Text(`${item.name}(${item.isSelected})`)
                .backgroundColor(this.getFilterItemBackgroundColor(item.isSelected))
                .fontColor(this.getFilterItemFontColor(item.isSelected))
                .padding({ top: 10, bottom: 10 })
                .width('30%')
                .textAlign(TextAlign.Center)
                .margin({ right: '3%', bottom: 10 })
                .borderWidth(1)
                .borderRadius(8)
                .borderColor('#efefef')
                .fontSize('13fp')
                .onClick(() => {
                  item.isSelected = !item.isSelected
                })
            })
          }
        })
      }

      Row() {
        Text("清空")
          .textAlign(TextAlign.Center)
          .borderRadius(12)
          .backgroundColor("#f2f2f2")
          .fontColor("#555555")
          .padding(15)
          .layoutWeight(1)
          .margin({ right: 8 })
          .onClick(() => {
            this.tabInfo.tabGroups?.forEach((itemGroup: TabGroup) => {
              itemGroup.tabs?.forEach((itemTab: TabItem) => {
                itemTab.isSelected = false
              })
            })
          })
        Text("确定")
          .textAlign(TextAlign.Center)
          .borderRadius(12)
          .backgroundColor("#33a634")
          .fontColor(Color.White)
          .padding(15)
          .layoutWeight(1)
          .margin({ left: 8 })
          .onClick(() => {

          })
      }
    }.padding(20)
    .alignItems(HorizontalAlign.Start)

  }

  private getFilterItemBackgroundColor(isSelected: boolean) {
    if (isSelected) {
      return "#ebf7eb"
    } else {
      return "#ffffff"
    }
  }

  private getFilterItemFontColor(isSelected: boolean): string {
    if (isSelected) {
      return "#33a634"
    } else {
      return "#555555"
    }
  }
}

function TestData(): TabInfo {
  const info = new TabInfo()
  const group1 = new TabGroup()
  const item1 = new TabItem()
  item1.name = "测1"
  const item2 = new TabItem()
  item2.name = "测2"
  const item3 = new TabItem()
  item3.name = "测3"
  const item4 = new TabItem()
  item4.name = "测4"
  const item5 = new TabItem()
  item5.name = "测5"
  group1.name = "组1"
  group1.tabs = [item1, item2, item3, item4, item5]
  const group2 = new TabGroup()
  const item6 = new TabItem()
  item6.name = "测6"
  group2.name = "组2"
  group2.tabs = [item6]
  info.tabGroups = [group1, group2]
  return info
}

[@Observed](/user/Observed)
class TabInfo {
  tabGroups?: TabGroup[]
}

[@Observed](/user/Observed)
class TabGroup {
  name?: string
  tabs?: TabItem[]
}

class TabItem {
  name?: string
  isSelected: boolean = false
}

更多关于HarmonyOS 鸿蒙Next ForEach中Item对象属性变化,不会刷新UI的实战教程也可以访问 https://www.itying.com/category-93-b0.html

9 回复

更多关于HarmonyOS 鸿蒙Next ForEach中Item对象属性变化,不会刷新UI的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


这个demo是根据实际代码写的,可能写漏了,但是加上也没用的。你可以试试。这个demo直接copy进去就可以运行。

要配合 @ObjectLink 一起使用呀。

@ObjectLink 是自定义控件传@Observed修饰的对象。

@Component确实存在应该刷新但是不刷新的情况,我之前频繁遇到这种情况,后来发现,如果修改所在Class中的其它无关属性可以触发更新,就设置了一个boolean类型的类成员专门用于触发更新。现在我改用@ComponentV2了,就完全不存在此情况

现在都换成V2吗?有demo嘛?我试了V2,@State都没有啊= =,

没有@State,改成@Local了,

V1项目想换v2几乎伤筋动骨,所有地方都得改一遍,改一遍后还得改传值方式和逻辑,成本很大

在HarmonyOS(鸿蒙)开发中,如果你遇到在Next For Each组件中Item对象的属性变化不会刷新UI的问题,这通常是因为数据绑定机制未能正确触发界面更新。

鸿蒙系统的UI框架依赖于数据绑定来自动刷新界面。当Item对象的属性发生变化时,如果这些数据是通过数据绑定机制连接到UI组件的,UI应该会自动更新。如果UI没有刷新,可能的原因包括:

  1. 数据对象未实现INotifyPropertyChanged接口:鸿蒙系统中,如果数据对象需要通知界面属性变化,可能需要实现一个类似的接口(具体接口名可能因版本而异),以便在属性变化时发出通知。

  2. 属性变化未触发通知:即使实现了通知接口,也需要确保在属性setter中正确调用了通知方法。

  3. UI组件未正确绑定数据:检查Next For Each组件中的Item模板是否正确绑定了数据对象的属性。

  4. 线程问题:确保属性更新是在UI线程上进行的,鸿蒙系统可能要求界面更新必须在主线程执行。

检查以上几点,确保数据对象、属性变化和UI绑定都符合鸿蒙系统的要求。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部