HarmonyOS 鸿蒙Next @State嵌套的属性赋值观察不到验证失败
HarmonyOS 鸿蒙Next @State嵌套的属性赋值观察不到验证失败
参考官方网址:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-state-V5
使用5.0版本(12)学习@State装饰器:组件内状态,根据代码案例,嵌套的属性赋值观察不到,但是根据预览器和模拟器测试,可以观察到数据变化,请分析代码并确认是否正确。
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%’)
}
}
你在同一个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)
装饰后,这个类的实例对象就成为了可被观察的对象。这意味着该对象属性的任何变化都能够被系统监测到。表示的意思是 对于简单类型的改变 会刷新UI,复杂类型 不会刷新ui
在HarmonyOS鸿蒙开发中,遇到@State
嵌套属性赋值后观察不到变化或验证失败的问题,通常是由于状态管理或属性绑定机制未正确实现。以下是一些可能的原因及排查方向:
-
确保嵌套属性是可变的:如果嵌套对象是不可变的(如基本数据类型包装类或不可变集合),则需要确保每次更新时都创建新的对象实例,以便触发UI更新。
-
使用
@ObservedObject
或@ObservedResults
:对于复杂对象,考虑使用@ObservedObject
或@ObservedResults
来包装,这样当对象内部属性变化时,UI会自动更新。 -
检查属性路径:确保在模板中正确引用嵌套属性的路径。例如,如果状态是
@State var person: Person?
,且Person
有一个name
属性,则应使用$person?.name
进行绑定。 -
避免循环依赖:检查代码中是否有循环依赖或不必要的计算属性,这些可能导致状态更新被忽略。
-
编译器和IDE更新:确保你的开发环境和编译器是最新的,有时候问题可能是由旧版本的bug导致的。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html