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
这个demo是根据实际代码写的,可能写漏了,但是加上也没用的。你可以试试。这个demo直接copy进去就可以运行。
要配合 @ObjectLink
一起使用呀。
@ObjectLink 是自定义控件传@Observed修饰的对象。
@Component确实存在应该刷新但是不刷新的情况,我之前频繁遇到这种情况,后来发现,如果修改所在Class中的其它无关属性可以触发更新,就设置了一个boolean类型的类成员专门用于触发更新。现在我改用@ComponentV2了,就完全不存在此情况
现在都换成V2吗?有demo嘛?我试了V2,@State都没有啊= =,
V1项目想换v2几乎伤筋动骨,所有地方都得改一遍,改一遍后还得改传值方式和逻辑,成本很大
在HarmonyOS(鸿蒙)开发中,如果你遇到在Next For Each
组件中Item对象的属性变化不会刷新UI的问题,这通常是因为数据绑定机制未能正确触发界面更新。
鸿蒙系统的UI框架依赖于数据绑定来自动刷新界面。当Item对象的属性发生变化时,如果这些数据是通过数据绑定机制连接到UI组件的,UI应该会自动更新。如果UI没有刷新,可能的原因包括:
-
数据对象未实现INotifyPropertyChanged接口:鸿蒙系统中,如果数据对象需要通知界面属性变化,可能需要实现一个类似的接口(具体接口名可能因版本而异),以便在属性变化时发出通知。
-
属性变化未触发通知:即使实现了通知接口,也需要确保在属性setter中正确调用了通知方法。
-
UI组件未正确绑定数据:检查
Next For Each
组件中的Item模板是否正确绑定了数据对象的属性。 -
线程问题:确保属性更新是在UI线程上进行的,鸿蒙系统可能要求界面更新必须在主线程执行。
检查以上几点,确保数据对象、属性变化和UI绑定都符合鸿蒙系统的要求。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html,