HarmonyOS 鸿蒙Next @ObjectLink装饰的对象的属性改变后Text不刷新

发布于 1周前 作者 eggper 来自 鸿蒙OS

HarmonyOS 鸿蒙Next @ObjectLink装饰的对象的属性改变后Text不刷新 @ObjectLink装饰的对象里的字段每3秒刷新一次,Text里显示某动态刷新的字段,数据字段dataBean.stockZdf在不断刷新,但是Text无法更新。可是点击弹出toast显示出字段内容却是当前实时更新后的。

@Observed
export class DataBean {
  stockName: string
  stockZdf: string
}
// 列表组件
@Component
export struct ListView {
@State dataSource: CommonDataSource<DataBean> = new CommonDataSource<DataBean>()

build() {
  List() {
    LazyForEach(this.dataSource, (item: DataBean, index: number) => {
      ListItem() {
        ItemView({dataBean: item})
      }
    }, (item: DataBean) => item.id)
  }
}
// 列表项
@Component
export struct ItemView {
[@ObjectLink](/user/ObjectLink) dataBean: DataBean

@Builder
RelatedStocks() {
  Flex({ justifyContent: FlexAlign.Center }) {
    Text(this.dataBean.stockName)
      .margin({ right: 5 })
    Text(this.dataBean.stockZdf)
  }
  .width(118)
  .border({ radius: 9 })
  .padding({ left: 10, right: 10 })
  .onClick(() => {
    promptAction.showToast({ message: this.dataBean.stockName + ' ' + this.dataBean.stockZdf })
  })
}

更多关于HarmonyOS 鸿蒙Next @ObjectLink装饰的对象的属性改变后Text不刷新的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

14 回复

我给你完善了下代码,stockZdf 变化,Text是会跟着变化的。

import promptAction from '@ohos.promptAction'

@Observed
export class DataBean {
  id: string;
  stockName: string
  stockZdf: string

  constructor(id: string, stockName:string, stockZdf: string) {
    this.id = id;
    this.stockName = stockName;
    this.stockZdf = stockZdf;
  }
}

class CommonDataSource<DataBean> implements IDataSource {

  private dataList : Array<DataBean> = new Array<DataBean>();
  private listeners: Array<DataChangeListener> = new Array<DataChangeListener>();

  unregisterDataChangeListener(listener: DataChangeListener): void {
    let index = this.listeners.indexOf(listener)
    if( index > 0){
      this.listeners.splice(index, 1)
    }
  }

  registerDataChangeListener(listener: DataChangeListener): void {
    if(this.listeners.indexOf(listener) < 0){
      this.listeners.push(listener)
    }
  }

  getData(index: number) {
    return this.dataList[index];
  }

  totalCount(): number {
    return this.dataList.length;
  }

  notifyDataAdd(index: number): void {
    this.listeners.forEach(listener => {
      listener.onDataAdd(index);
    })
  }

  public notifyDataChange(index: number): void {
    this.listeners.forEach(listener => {
      listener.onDataChange(index);
    })
  }

  public addData(index: number, data: DataBean): void {
    this.dataList.splice(index, 0, data);
    this.notifyDataAdd(index);
  }

}

let itemID : number = 0
// 列表组件
@Entry
@Component
export struct ListView {
  @State dataSource: CommonDataSource<DataBean> = new CommonDataSource<DataBean>()

  private  temp : number = 0;
  build() {
    List() {
      LazyForEach(this.dataSource, (item: DataBean, index: number) => {
        ListItem() {
          ItemView({ dataBean: item })
        }
      }, (item: DataBean) => item.id)
    }
  }

  aboutToAppear(){
    this.dataSource.addData(0, new DataBean(`${itemID++}` , "a","b"))

    setInterval(() =>{
      this.dataSource.getData(0).stockZdf +=1;
    },200)
  }
}

// 列表项
@Component
export struct ItemView {
  @ObjectLink dataBean: DataBean

  build() {
    this.RelatedStocks()
  }

  @Builder
  RelatedStocks() {
    Flex({ justifyContent: FlexAlign.Center }) {
      Text(this.dataBean.stockName)
        .margin({ right: 5 })
      Text(this.dataBean.stockZdf)
    }
    .width(118)
    .border({ radius: 9 })
    .padding({ left: 10, right: 10 })
    .onClick(() => {
      promptAction.showToast({ message: this.dataBean.stockName + ' ' + this.dataBean.stockZdf })
    })
  }
}

更多关于HarmonyOS 鸿蒙Next @ObjectLink装饰的对象的属性改变后Text不刷新的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


我知道原因了,数据类`DataBean`必须是要`new`出来的,属性的变化才能触发UI刷新😓我是用Json解析出来的,`JSON.parse(json)`。

Json解析出来后,我再循环遍历这个数据list,再`new`一次,Tex就能刷新了。绝了!,

我刚好也碰到这个问题了,绝了,感觉这是个BUG。。。

如果有二级Bean,三级Bean改怎么重新组装数据呢,

如果有二级Bean,三级Bean改怎么重新组装数据呢,

你好,伙计能否具体点,这里说的new  意思是接口请求的数据中的array遍历重新New下赋值吗?

我的数据实体类对象有点复杂
属性巨多,

请问解决了吗。我也是属性很多,

这个有其他解决办法吗

class-transformer@0.5.1,

伙计,你说的这个具体怎么用 ,麻烦指导下,

把返回对象使用这个框架的方法转一下,用他的返回值就好了,

兄弟怎么解决的有没有完整代码

class-transformer@0.5.1

在HarmonyOS(鸿蒙)开发中,当你使用@ObjectLink装饰对象,并且该对象的属性发生变化时,如果绑定的Text组件没有刷新,这通常是由于数据绑定机制未能正确触发界面更新。

可能的原因包括:

  1. 属性是否为可观察(Observable):确保被@ObjectLink装饰的对象属性是可观察的。在鸿蒙系统中,通常需要通过特定的注解或接口来标记属性为可观察,以便当属性变化时能够通知界面进行更新。

  2. 数据绑定是否正确:检查Text组件的数据绑定表达式是否正确指向了@ObjectLink装饰的对象及其属性。错误的绑定表达式或路径会导致界面无法接收到属性变化的通知。

  3. 上下文(Context)问题:确保@ObjectLink装饰的对象与Text组件处于相同的上下文环境中。不同的上下文环境可能会导致数据绑定失效。

  4. UI线程更新:虽然鸿蒙系统通常会自动处理UI线程更新,但在某些复杂场景下,可能需要手动确保界面更新操作在UI线程执行。

如果上述检查后问题依旧没法解决,请访问官网客服寻求进一步帮助。官网地址是:https://www.itying.com/category-93-b0.html

回到顶部