HarmonyOS鸿蒙Next中无感监听一次注销就全部注销了,有其他方案?

HarmonyOS鸿蒙Next中无感监听一次注销就全部注销了,有其他方案?

使用无感监听,A:业务开始调用observer.on(‘navDestinationUpdate’),disaapper的时候调用observer.off(‘navDestinationUpdate’),B业务中途调用了observer.off(‘navDestinationUpdate’),结果A业务收不到监听。

3 回复
  1. 在使用无感监听observer.on(‘navDestinationUpdate’)时第二参数设置为回调时,会在调用时observer.off(‘navDestinationUpdate’)时被全部注销;
  2. 在第二参数指定为navigationId时,只有在调用传入对应的navigationId才会被注销掉。

参考链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V13/js-apis-arkui-observer-V13#observeronnavdestinationupdate-1

更多关于HarmonyOS鸿蒙Next中无感监听一次注销就全部注销了,有其他方案?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,无感监听一次注销导致全部注销的问题,可以通过使用LifecycleObserver来管理监听器的生命周期。LifecycleObserver能够根据组件的生命周期自动注册和注销监听器,避免手动管理带来的问题。具体实现时,可以在onStartonStop生命周期回调中分别注册和注销监听器,确保监听器仅在组件活跃时运行。

在HarmonyOS Next中,无感监听(observer)的off()方法会完全移除对应事件的所有监听器。针对您的问题,可以考虑以下替代方案:

  1. 使用命名空间区分不同业务的监听:
// 业务A注册监听
const callbackA = (event) => { /* 业务A处理逻辑 */ };
observer.on('navDestinationUpdate', callbackA);

// 业务B注册监听 
const callbackB = (event) => { /* 业务B处理逻辑 */ };
observer.on('navDestinationUpdate', callbackB);

// 业务B注销时只移除自己的监听
observer.off('navDestinationUpdate', callbackB);
  1. 使用事件总线替代:
// 创建不同事件通道
const eventA = new EventChannel('navUpdateA');
const eventB = new EventChannel('navUpdateB');

// 业务A监听自己的通道
eventA.on('update', (data) => { /* 处理逻辑 */ });

// 业务B监听自己的通道  
eventB.on('update', (data) => { /* 处理逻辑 */ });

// 业务B可单独注销
eventB.off('update');
  1. 封装监听管理器:
class ListenerManager {
  private listeners = new Map<string, Function[]>();

  on(event: string, callback: Function) {
    if (!this.listeners.has(event)) {
      this.listeners.set(event, []);
    }
    this.listeners.get(event).push(callback);
    observer.on(event, callback);
  }

  off(event: string, callback?: Function) {
    if (callback) {
      const callbacks = this.listeners.get(event);
      const index = callbacks.indexOf(callback);
      if (index !== -1) {
        callbacks.splice(index, 1);
        observer.off(event, callback);
      }
    } else {
      this.listeners.get(event).forEach(cb => {
        observer.off(event, cb);
      });
      this.listeners.delete(event);
    }
  }
}

这些方案都能实现不同业务监听器的独立管理,避免相互影响。

回到顶部