HarmonyOS鸿蒙Next中请问添加观察者方法重载,在ArkTs和napi中的最佳实践是怎样的呢

HarmonyOS鸿蒙Next中请问添加观察者方法重载,在ArkTs和napi中的最佳实践是怎样的呢

我现在正在将c++接口代码通过napi转换称为ArkTs接口,c++代码存在如下的使用方式

class InterfaceA
{
    virtual void OnCallback() = 0;
};
class InterfaceB
{
    virtual void OnCallback() = 0;
};
class TestService{
  void addObserver(InterfaceA a);
  void addObserver(InterfaceB b);
}

其中InterfaceA和InterfaceB都是用来实现观察者的类。

问题是我发现napi和ArkTs不支持方法签名,导致方法重载实现起来非常痛苦。

想问下,这种情况下,如果不改变c++接口,也不能对ArkTs接口使用者有太多的限制(比如要求实现Interface的类加字段或者方法之类的),有什么比较好的实现方案吗。

附上我看到的地图api的实现方案,我觉得这样可以接受,但是很好奇,如果用户传的字符不符合枚举会发生什么?

        on(type: 'cameraChange', callback: Callback<mapCommon.LatLng>): void;

        off(type: 'cameraChange', callback: Callback<void>): void;

        on(type: 'cameraIdle', callback: Callback<void>): void;

        off(type: 'cameraIdle', callback: Callback<void>): void;

更多关于HarmonyOS鸿蒙Next中请问添加观察者方法重载,在ArkTs和napi中的最佳实践是怎样的呢的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在HarmonyOS鸿蒙Next中,添加观察者方法重载的实践在ArkTS和NAPI中有不同的实现方式。

在ArkTS中,观察者模式通常通过@Observed@ObjectLink装饰器来实现。@Observed用于标记一个类为可观察的,@ObjectLink用于在组件中引用可观察对象。当可观察对象的属性发生变化时,使用@ObjectLink的组件会自动更新。例如:

@Observed
class MyModel {
  value: number = 0;
}

@Component
struct MyComponent {
  @ObjectLink model: MyModel;

  build() {
    Text(`Value: ${this.model.value}`)
  }
}

在NAPI中,观察者模式可以通过napi_create_referencenapi_wrapnapi_unwrap等API来实现。首先,创建一个对象并将其包装为napi_value,然后使用napi_create_reference创建对该对象的引用。当对象的状态发生变化时,通过napi_call_function调用回调函数来通知观察者。例如:

napi_value myObject;
napi_create_object(env, &myObject);

napi_ref myRef;
napi_create_reference(env, myObject, 1, &myRef);

// 当对象状态变化时
napi_value callback;
napi_get_reference_value(env, myRef, &callback);
napi_call_function(env, undefined, callback, 0, nullptr, nullptr);

这两种方式分别适用于ArkTS和NAPI环境,具体选择取决于开发场景和需求。

更多关于HarmonyOS鸿蒙Next中请问添加观察者方法重载,在ArkTs和napi中的最佳实践是怎样的呢的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,添加观察者方法重载的最佳实践如下:

ArkTS:

  1. 使用@Observed装饰器标记可观察类。
  2. 在组件中通过@State@Link绑定可观察对象。
  3. 使用watchEffectwatch函数监听状态变化。

NAPI:

  1. 使用napi_create_reference创建持久引用。
  2. 通过napi_wrap将JavaScript对象与原生对象绑定。
  3. 使用napi_add_finalizernapi_call_threadsafe_function进行异步回调。

这两种方式都需确保线程安全和内存管理,根据具体场景选择合适的实现方式。

回到顶部