HarmonyOS鸿蒙Next中请问两个类或一个组件和一个类怎么双向绑定同一个变量?

HarmonyOS鸿蒙Next中请问两个类或一个组件和一个类怎么双向绑定同一个变量? 如题,我知道两个组件之间可以使用@State@Link@StorageLink等实现。 那么,如果是两个类呢?

目前我能够想到的是AppStorage.get()、AppStroage.setOrCreate()、emitter。不过发现使用起来有延迟。

有没有延迟比较小点的方案呢?

······················································································

跟大家说下目前的开发背景:

1、需要 avPlayer工具、通知栏的播控中心、Silder组件    三者的播放进度保持一致

2、我尝试了AppStorage、emitter,效果不理想:一是滑动不流畅、二是有时候滑过去了但是又弹回去了,所以给人的体验感不好

所以,基于以上问题,希望能获取一个理想的解决方案。如果大家有经验,有想法,欢迎给予意见!


更多关于HarmonyOS鸿蒙Next中请问两个类或一个组件和一个类怎么双向绑定同一个变量?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

5 回复

两个类的问题:把两个类封装成一个类,再用@Trace 修饰。一个组件和一个类这个简单就不说了,不理解再问。


似乎你使用了 V1 装饰器,那可能这个就不适用了,能修改成 V2 是最好的。

更多关于HarmonyOS鸿蒙Next中请问两个类或一个组件和一个类怎么双向绑定同一个变量?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


不错不错,我试了一下,确实可以,

各位,我知道什么原因了,进度条之所以不流畅,是因为我这边加的判断只是在拖动结束的时候才跳转,这样有时候会弹回去,不流畅。我参考一个示例,将代码修改了,将判断修改成以下的后就顺畅多了,基本上不会再弹回去:

Slider()组件的onChange()方法中可以加入下列判断

if (mode === SliderChangeMode.End || mode === SliderChangeMode.Begin)

在HarmonyOS鸿蒙Next中,通过@State装饰器声明响应式变量,使用@Link@Prop装饰器实现双向绑定。多个组件或类可同时绑定同一变量,确保数据同步更新。例如,父组件使用@State声明变量,子组件通过@Link接收并修改,实现双向数据流。

在HarmonyOS Next中,若需实现两个类或一个组件与一个类之间的双向绑定,推荐使用[@Observed](/user/Observed)@ObjectLink装饰器结合的方式,这能有效减少延迟并提升响应性能。以下是具体方案:

  1. 定义被观察类:使用[@Observed](/user/Observed)装饰类,确保其属性变化可被监听。

    [@Observed](/user/Observed)
    class ProgressData {
      currentTime: number = 0;
    }
    
  2. 在组件和类中引用同一实例:通过@ObjectLink装饰变量,实现双向绑定。

    [@Component](/user/Component)
    struct SliderComponent {
      @ObjectLink progressData: ProgressData;
      // 组件内修改progressData.currentTime会同步到类实例
    }
    
    // 在另一个类或组件中同样绑定该实例
    class AVPlayerTool {
      @ObjectLink progressData: ProgressData;
      // 类内部修改也会触发同步
    }
    
  3. 共享数据实例:确保组件和类使用同一个ProgressData实例,可通过构造函数或依赖注入传递。

此方案基于ArkUI的响应式机制,直接监听对象属性变化,避免了AppStorage或Emitter的事件派发延迟,能显著提升滑动流畅度和实时性,适合播控进度同步等高频率更新场景。

回到顶部