HarmonyOS 鸿蒙Next @Observerd和@Trance装饰的类,ui不刷新,关于是否选中的ui

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

HarmonyOS 鸿蒙Next @Observerd@Trance装饰的类,ui不刷新,关于是否选中的ui

/**
* @Author ZZ
* @DateTime 2024/10/22 10:19
*
* @Description 筛选弹窗
*/
import { CommonConstants } from ‘@ohos/common’
import { promptAction } from ‘@kit.ArkUI’
import { JSON } from ‘@kit.ArkTS’

@ObservedV2
export class filterItem {
id?: string;
category?: string;
subCategoryName?: string;
imageUrl?: null;
@Trace isAll?: boolean=false;
}

@ComponentV2
export struct DiningFiltercomp {
@Param DiningsFilterData: filterItem[] = []
@Param topHeight: number = 0
@Provider(‘isAllSelect’) isAllSelect: boolean = false

build() {
Column() {
Image($rawfile(‘function/filter_btn_p.png’)).width(36).alignSelf(ItemAlign.End).offset({ x: -8 })
Column() {
Flex({ wrap: FlexWrap.Wrap, justifyContent: FlexAlign.SpaceBetween }) {
// 全选内容
Row({ space: 4 }) {
Image($rawfile(this.isAllSelect ? ‘function/inbox_select.png’ : ‘function/inbox_unselect.png’))
.width(18)
Text(‘All’)
.fontColor(this.isAllSelect ? $r(‘app.color.text_color_ffc26d’) : ‘#ccc’)
.layoutWeight(1)
.fontSize(14)
}
.padding({ left: 10 })
.width(‘50%’)
.margin({ top: 6, bottom: 6 })
.onClick(() => {
this.toggleAllSelection();
})

// 循环数据
ForEach(this.DiningsFilterData, (item: filterItem) => {
isSelectComp({ itemData: item, AllData: this.DiningsFilterData })
})
}

Divider().border({ width: 1, color: ‘#ccc’ }).width(‘96%’).offset({ x: -4 }).margin({ top: 18, bottom: 8 })
}
.padding({
left: 10,
top: 20,
bottom: 10
})
.width(CommonConstants.FULL_WIDTH)
.backgroundImage($rawfile(‘function/dinning_filter_bg.png’))
.backgroundImageSize(ImageSize.FILL)
}
.padding({ top: this.topHeight })
.width(‘96%’)
}

private toggleAllSelection() {
this.isAllSelect = !this.isAllSelect;
for (let i = 0; i < this.DiningsFilterData.length; i++) {
this.DiningsFilterData[i].isAll = this.isAllSelect;
}
}
}

// 选项组件
@ComponentV2
export struct isSelectComp {
@Param itemData: filterItem = new filterItem()
@Param AllData: filterItem[] = []
@Consumer(‘isAllSelect’) isAllSelect: boolean = false

build() {
Row({ space: 4 }) {
Text(String(this.itemData.isAll)).fontColor(’#fff’)
Image($rawfile(this.itemData.isAll ? ‘function/inbox_select.png’ : ‘function/inbox_unselect.png’))
.width(18)
Text(this.itemData.subCategoryName)
.fontColor(this.itemData.isAll ? $r(‘app.color.text_color_ffc26d’) : ‘#ccc’)
.layoutWeight(1)
.fontSize(14)
}
.padding({ left: 10 })
.width(‘50%’)
.margin({ top: 6, bottom: 6 })
.onClick(() => {
this.toggleItemSelection();
})
}

private toggleItemSelection() {
this.itemData.isAll = !this.itemData.isAll;
promptAction.showToast({ message: JSON.stringify(this.itemData.isAll) });

// 控制全选状态
this.updateAllSelection();
}

private updateAllSelection() {
let allSelected = true;
for (let i = 0; i < this.AllData.length; i++) {
if (!this.AllData[i].isAll) {
allSelected = false;
break;
}
}
this.isAllSelect = allSelected;
}
}

1 回复

在HarmonyOS鸿蒙系统中,使用@Observed@Trance注解进行数据绑定时,如果UI未能正确刷新以反映数据的变化,这通常与数据绑定机制或UI组件的刷新逻辑有关。

首先,请确保你的数据模型类已经正确使用了@Observed注解来标记需要观察的属性。这个注解用于指示系统该属性是可观察的,当属性值发生变化时,应触发UI更新。

其次,检查UI组件是否已正确绑定到这些可观察的属性上。通常,这是通过在XML布局文件中使用{{}}语法绑定数据,或在Java/Kotlin代码中通过@Link注解实现的。

此外,@Trance(假设你指的是@Transactable,因为@Trance并非HarmonyOS的标准注解)通常用于服务间通信的接口方法上,与UI刷新无直接关系。但如果你的UI更新依赖于服务返回的数据,确保服务调用正确且数据已正确传递回UI线程。

如果以上都确认无误,但问题依旧存在,可能是系统内部的某种缓存或同步机制导致的问题。此时,可以尝试强制刷新UI(如调用组件的invalidate()方法),或者检查是否有其他线程干扰了UI更新。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部