HarmonyOS 鸿蒙Next中为什么状态变量不更新?isShow1和isShow2都可以更新,但是isShow3状态变量不更新

HarmonyOS 鸿蒙Next中为什么状态变量不更新?isShow1和isShow2都可以更新,但是isShow3状态变量不更新

isShowModel.ets

@ObservedV2
export class IsShowModel {
  @Trace
  isShow: boolean = false
  static instance?: IsShowModel
  static instance2: IsShowModel = new IsShowModel()

  static getInstance() {
    if(!IsShowModel.instance) {
      return new IsShowModel()
    }
    return IsShowModel.instance
  }

  getInstance2() {
    if(!IsShowModel.instance) {
      return new IsShowModel()
    }
    return IsShowModel.instance
  }
}

Index.ets

import { IsShowModel } from '../models/isShowModel'

@Entry
@ComponentV2
struct Index {
  @Local isShow1: IsShowModel = new IsShowModel()
  @Local isShow2: IsShowModel = IsShowModel.getInstance()
  @Local isShow3: IsShowModel = IsShowModel.instance2.getInstance2()

  build() {
    Column({space: 22}) {
      Column({space: 38}) {
        if(this.isShow1.isShow) {
          Text('Hello World!!!')
            .width(150)
            .height(150)
            .backgroundColor(Color.Pink)
        }
        Button("点我修改isShow1")
          .onClick(() => {
            this.isShow1.isShow = !this.isShow1.isShow
          })
      }

      Column({space: 38}) {
        if(this.isShow2.isShow) {
          Text('Hello World!!!')
            .width(150)
            .height(150)
            .backgroundColor(Color.Pink)
        }
        Button("点我修改isShow2")
          .onClick(() => {
            this.isShow2.isShow = !this.isShow2.isShow
          })
      }

      Column({space: 38}) {
        if(this.isShow3.isShow) {
          Text('Hello World!!!')
            .width(150)
            .height(150)
            .backgroundColor(Color.Pink)
        }
        Button("点我修改isShow3")
          .onClick(() => {
            this.isShow3.isShow = !this.isShow3.isShow
          })
      }
    }
    .width('100%')
    .height('100%')
  }
}

更多关于HarmonyOS 鸿蒙Next中为什么状态变量不更新?isShow1和isShow2都可以更新,但是isShow3状态变量不更新的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

我直接复制你的代码 三个状态都可以响应

开发SDK

HarmonyOS 5.0.4 Release SDK, inclusion of OpenHarmony SDK Ohos_sdk_public 5.0.4.150 (API Version 16 Release) as is。

真机设备API 5.0.5(17)

更多关于HarmonyOS 鸿蒙Next中为什么状态变量不更新?isShow1和isShow2都可以更新,但是isShow3状态变量不更新的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在鸿蒙Next中,状态变量不更新通常是由于@State装饰器的使用问题。isShow3可能未正确使用@State装饰器,或在自定义组件中被错误绑定。检查三点:1) isShow3必须用@State修饰;2) 确保在build()中直接引用该变量;3) 若涉及深层嵌套,需用@Observed@ObjectLink处理对象属性。同步更新失败时,需确认是否在非UI线程修改了状态。

在HarmonyOS Next中,状态变量不更新的问题通常与响应式系统的实现机制有关。针对你的代码,isShow3不更新的原因主要有以下几点:

  1. 单例模式问题:你的 IsShowModel.instance2.getInstance2() 实际上返回的是同一个实例,而 @Local 装饰器要求每次获取的实例都应该是新的。静态变量 instance2 在类加载时就初始化了,后续通过 getInstance2() 获取的始终是同一个对象。

  2. 响应式跟踪失效:对于 isShow3,由于它引用的是同一个静态实例,HarmonyOS的响应式系统无法正确跟踪其内部状态变化。这与 isShow1isShow2 不同,它们每次都会创建新实例。

  3. 静态实例的生命周期:静态变量 instance2 的生命周期与组件不同,当组件重新渲染时,它不会被重新初始化,导致状态更新无法触发UI刷新。

解决方案建议:

  1. 避免在 @Local 变量中使用静态实例。
  2. 确保每次组件构建时都创建新的实例。
  3. 对于需要共享的状态,考虑使用 @Provide/@InjectAppStorage 等状态管理方案。

关键点在于:HarmonyOS的响应式系统要求状态变量必须是组件局部的新实例,才能正确跟踪变化。

回到顶部