HarmonyOS 鸿蒙Next @State嵌套的属性赋值观察不到验证失败

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

HarmonyOS 鸿蒙Next @State嵌套的属性赋值观察不到验证失败

参考官方网址:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-state-V5

使用5.0版本(12)学习@State装饰器:组件内状态,根据代码案例,嵌套的属性赋值观察不到,但是根据预览器和模拟器测试,可以观察到数据变化,请分析代码并确认是否正确。

cke_2182.png

class ClassA {
public value: string;
constructor(value: string) {
this.value = value;
}
}
class Model {
public value: string;
public name: ClassA;
constructor(value: string, a: ClassA) {
this.value = value;
this.name = a;
}
}


@Entry
@Component
struct SecondPage {
// class类型
@State title: Model = new Model(‘Hello’, new ClassA(‘World’));
build() {
Row() {
Column({space:20}) {
Text(this.title.value).fontSize(30)
Text(this.title.name.value).fontSize(30)
Button(‘改变’)
.onClick(()=>{
// class属性的赋值
this.title.value = ‘Hi’;
// 嵌套的属性赋值观察不到
this.title.name.value = ‘ArkUI’;
})

}
.width(‘100%’)
}
.height(‘100%’)
}
}

5 回复

你在同一个onclick触发两次赋值,在第一个的时候已经触发UI刷新了,所以现象是两个赋值都被观察到了,用下面的代码,两个按钮分开触发就和官方文档现象一样了

class ClassA {
  public value: string;
  constructor(value: string) {
    this.value = value;
  }
}
class Model {
  public value: string;
  public name: ClassA;
  constructor(value: string, a: ClassA) {
    this.value = value;
    this.name = a;
  }
}

@Entry @Component struct SecondPage { // class类型 @State title: Model = new Model(‘Hello’, new ClassA(‘World’)); aboutToAppear(): void {

} build() { Row() { Column({space:20}) { Text(this.title.value).fontSize(30) Text(this.title.name.value).fontSize(30) // Text(this.title.name).fontSize(30) Button(‘改变’) .onClick(()=>{ // class属性的赋值 this.title.value = ‘Hi’; }) Button(‘改变2’) .onClick(()=> { // 嵌套的属性赋值观察不到 this.title.name.value = ‘ArkUI’; }) } .width(‘100%’) } .height(‘100%’) } }

还有[@Observed](/user/Observed)装饰器。当一个类被[@Observed](/user/Observed)装饰后,这个类的实例对象就成为了可被观察的对象。这意味着该对象属性的任何变化都能够被系统监测到。
使用[@ObjectLink](/user/ObjectLink)装饰器吧,[@ObjectLink](/user/ObjectLink)装饰器可用于监测多层嵌套对象的变化。

表示的意思是 对于简单类型的改变 会刷新UI,复杂类型 不会刷新ui 

cke_914.png

在HarmonyOS鸿蒙开发中,遇到@State嵌套属性赋值后观察不到变化或验证失败的问题,通常是由于状态管理或属性绑定机制未正确实现。以下是一些可能的原因及排查方向:

  1. 确保嵌套属性是可变的:如果嵌套对象是不可变的(如基本数据类型包装类或不可变集合),则需要确保每次更新时都创建新的对象实例,以便触发UI更新。

  2. 使用@ObservedObject@ObservedResults:对于复杂对象,考虑使用@ObservedObject@ObservedResults来包装,这样当对象内部属性变化时,UI会自动更新。

  3. 检查属性路径:确保在模板中正确引用嵌套属性的路径。例如,如果状态是@State var person: Person?,且Person有一个name属性,则应使用$person?.name进行绑定。

  4. 避免循环依赖:检查代码中是否有循环依赖或不必要的计算属性,这些可能导致状态更新被忽略。

  5. 编译器和IDE更新:确保你的开发环境和编译器是最新的,有时候问题可能是由旧版本的bug导致的。

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

回到顶部