HarmonyOS 鸿蒙Next 无法动态修改定义对象中的数据

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

HarmonyOS 鸿蒙Next 无法动态修改定义对象中的数据

基本信息

export class ShopCartTableItem {
  id: number = -1;
  guigeid: number = -1;
  num: number = -1;
}

@Entry
@Component
struct Index {
  @State datas: Array<ShopCartTableItem> =[]
  aboutToAppear(): void {
    this.addData(1, 1, 1);
    this.addData(2, 2, 2);
    this.addData(3, 3, 3);
    this.addData(4, 4, 4);
  }
  build() {
    Column() {
      Button('修改')
        .onClick(() => {
          this.datas[0].id=2 //这里任意修改对象中的数据,页面显示不改变,该怎么做?
        })
      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center }) {
        Column() {
          ForEach(this.datas, (item: ShopCartTableItem, index: number) {
            Text(item.id.toString()+'——'+item.guigeid.toString()+'——'+item.num.toString())
          })
        }.width('100%').height('100%')
        .layoutWeight(1)
      }
      .height('100%')
      .width('100%')
    }

  }

  addData(id: number, guigeid: number, num: number) {
    const newItem = new ShopCartTableItem();
    newItem.id = id;
    newItem.guigeid = guigeid;
    newItem.num = num;
    this.datas.push(newItem);
  }
}

大佬们帮忙看看我这块的写法,修改对象数据没生效


更多关于HarmonyOS 鸿蒙Next 无法动态修改定义对象中的数据的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

Class属性修改无法被UI直接观测到,想要观测有两种实现方法:

1、@ObservedV2修饰需要观测的类,@Trace修饰类中需要观测的属性,在组件内使用@State修饰需要观测的对象

2、@Observed修饰需要观测的类,@Track修饰类中需要观测的属性,在组件内使用@State修饰需要观测的对象

注意:V1和V2状态管理混用有限制,混用规则参考

这里根据楼主demo以第1种方案的实现:

@ObservedV2
export class ShopCartTableItem {
  @Trace id: number = -1;
  @Trace guigeid: number = -1;
  @Trace num: number = -1;
}

@Entry
@Component
struct Index {
  @State datas: Array<ShopCartTableItem> = []
  aboutToAppear(): void {
    this.addData(1, 1, 1);
    this.addData(2, 2, 2);
    this.addData(3, 3, 3);
    this.addData(4, 4, 4);
  }
  build() {
    Column() {
      Button('修改')
        .onClick(() => {
          this.datas[0].id=2 //这里任意修改对象中的数据,页面显示不改变,该怎么做?
        })
      Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center }) {
        Column() {
          ForEach(this.datas, (item: ShopCartTableItem, index: number) => {
            Text(item.id.toString()+'——'+item.guigeid.toString()+'——'+item.num.toString())
          })
        }.width('100%').height('100%')
        .layoutWeight(1)
      }
      .height('100%')
      .width('100%')
    }
  }

  addData(id: number, guigeid: number, num: number) {
    const newItem = new ShopCartTableItem();
    newItem.id = id;
    newItem.guigeid = guigeid;
    newItem.num = num;
    this.datas.push(newItem);
  }
}

更多关于HarmonyOS 鸿蒙Next 无法动态修改定义对象中的数据的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


针对“HarmonyOS 鸿蒙Next 无法动态修改定义对象中的数据”的问题,这通常与鸿蒙系统的内存管理机制或对象属性定义方式有关。在鸿蒙系统中,对象的数据一旦被定义并初始化,其属性可能受到系统保护,不允许直接修改,特别是如果这些数据被定义为了不可变(immutable)类型。

要解决这个问题,你可以尝试以下方法:

  1. 检查对象属性定义:确保对象的属性没有被定义为只读或不可变。在鸿蒙的某些框架中,可能提供了特定的注解或配置来控制属性的可变性。

  2. 使用正确的方法修改数据:如果对象提供了修改数据的方法(如setter方法),应使用这些方法而非直接访问属性。

  3. 考虑数据绑定机制:鸿蒙系统可能使用了数据绑定机制来管理界面和数据之间的同步。如果数据无法动态修改,可能是因为绑定机制未正确设置或更新。

  4. 内存和线程安全考虑:在多线程环境下,对象的数据修改可能受到线程安全的限制。确保在修改数据时遵循鸿蒙系统的线程安全规范。

如果上述方法仍然无法解决问题,可能是由于鸿蒙系统的特定版本或框架限制。此时,建议直接查阅鸿蒙系统的官方文档或联系官网客服以获取更具体的帮助。官网客服地址是:https://www.itying.com/category-93-b0.html

回到顶部