HarmonyOS 鸿蒙Next @ObjectLink装饰的对象的属性改变后Text不刷新
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
我给你完善了下代码,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
组件没有刷新,这通常是由于数据绑定机制未能正确触发界面更新。
可能的原因包括:
-
属性是否为可观察(Observable):确保被
@ObjectLink
装饰的对象属性是可观察的。在鸿蒙系统中,通常需要通过特定的注解或接口来标记属性为可观察,以便当属性变化时能够通知界面进行更新。 -
数据绑定是否正确:检查
Text
组件的数据绑定表达式是否正确指向了@ObjectLink
装饰的对象及其属性。错误的绑定表达式或路径会导致界面无法接收到属性变化的通知。 -
上下文(Context)问题:确保
@ObjectLink
装饰的对象与Text
组件处于相同的上下文环境中。不同的上下文环境可能会导致数据绑定失效。 -
UI线程更新:虽然鸿蒙系统通常会自动处理UI线程更新,但在某些复杂场景下,可能需要手动确保界面更新操作在UI线程执行。
如果上述检查后问题依旧没法解决,请访问官网客服寻求进一步帮助。官网地址是:https://www.itying.com/category-93-b0.html