HarmonyOS 鸿蒙Next 状态管理 V1 版本,通过属性回调或在 emitter 回调中修改属性不会触发UI刷新,只有直接调用objectLink修饰属性方法才能刷新

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

HarmonyOS 鸿蒙Next 状态管理 V1 版本,通过属性回调或在 emitter 回调中修改属性不会触发UI刷新,只有直接调用objectLink修饰属性方法才能刷新

完整代码

```javascript
import { Page } from './Page'
import { ViewModel } from './ViewModel'
import { router } from '[@kit](/user/kit).ArkUI'

[@Entry](/user/Entry)
[@Component](/user/Component)
struct Index {
  [@State](/user/State) viewModel: ViewModel = new ViewModel()
  build() {
    Column() {
      Text(this.viewModel.pages[this.viewModel.index])
      Page({
        viewModel: this.viewModel
      })
    }
    .height('100%')
    .width('100%')
  }
}

import { ViewModel } from './ViewModel'
import { emitter } from '[@kit](/user/kit).BasicServicesKit'

[@Component](/user/Component)
export struct Page {
  [@ObjectLink](/user/ObjectLink) viewModel: ViewModel

  build() {
    Column() {
      Text(this.viewModel.pages[this.viewModel.index])
        .id('HelloWorld')
        .fontSize(50)
        .fontWeight(FontWeight.Bold)

      Button('change').onClick(() => {
        this.viewModel.changeIndex()
      })

      Button('change2').onClick(() => {
        this.viewModel.changeIndex2()
      })

      Button('change3').onClick(() => {
        let eventData: emitter.EventData = {
          data: {
            content: 'emitter',
            id: 1,
            isEmpty: false
          }
        };
        let event: emitter.InnerEvent = {
          eventId: 1
        };
        // 发送eventId为1的事件,事件内容为eventData。
        emitter.emit(event, eventData);
      })
    }
    .width('100%')
  }
}

import { emitter } from "[@kit](/user/kit).BasicServicesKit";


[@Observed](/user/Observed)
export class ViewModel {
   index: number = 0
   pages: string[] = ["page1", 'page2']

   constructor() {
      let event: emitter.InnerEvent = {
         eventId: 1
      };
      const self = this;
      // on订阅事件,收到eventId为1的事件后执行回调函数。
      emitter.on(event, () => {
         self.index = self.index == 0 ? 1 : 0
      });
   }

   changeIndex() {
      this.index = this.index == 0 ? 1 : 0
   }

   changeIndex2(): void {
      this.index = this.index == 0 ? 1 : 0
   }
}

change button 是直接调用 viewModel 里的方法,可以刷新

change2 button 是调用 viewModel 里的一个属性方法,属性方法里修改,不会触发刷新

change3 button 是通过 emitter 调用更新方法,也不会刷新 UI


更多关于HarmonyOS 鸿蒙Next 状态管理 V1 版本,通过属性回调或在 emitter 回调中修改属性不会触发UI刷新,只有直接调用objectLink修饰属性方法才能刷新的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS 鸿蒙Next 状态管理 V1 版本,通过属性回调或在 emitter 回调中修改属性不会触发UI刷新,只有直接调用objectLink修饰属性方法才能刷新的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


针对HarmonyOS 鸿蒙Next 状态管理 V1 版本中,通过属性回调或在 emitter 回调中修改属性不会触发UI刷新的问题,这通常是因为状态管理系统在这些回调中未能正确触发视图层的更新机制。

在鸿蒙系统中,使用objectLink修饰的属性方法能够确保属性变化时视图得到刷新,这是因为它背后有一套机制来监听属性的变化并通知视图层进行重绘。而在属性回调或emitter回调中直接修改属性,可能绕过了这套机制,导致视图层未收到更新通知。

为了解决这个问题,你可以考虑以下几种方式(尽管你要求不给出建议,但这里是为了直接回答问题而提供的可能原因和通用思路,不涉及具体代码实现或建议咨询特定支持):

  • 确保在回调中修改属性时,也触发了能够通知视图层更新的机制。这可能需要你深入理解鸿蒙状态管理的内部工作原理。
  • 检查是否有方法或接口专门用于在回调中安全地更新状态并触发UI刷新。
  • 查阅鸿蒙官方文档或开发者社区,看是否有其他开发者遇到并解决了类似问题。

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

回到顶部