HarmonyOS鸿蒙Next中无感监听一次注销就全部注销了,有其他方案?
HarmonyOS鸿蒙Next中无感监听一次注销就全部注销了,有其他方案?
使用无感监听,A:业务开始调用observer.on(‘navDestinationUpdate’),disaapper的时候调用observer.off(‘navDestinationUpdate’),B业务中途调用了observer.off(‘navDestinationUpdate’),结果A业务收不到监听。
3 回复
- 在使用无感监听observer.on(‘navDestinationUpdate’)时第二参数设置为回调时,会在调用时observer.off(‘navDestinationUpdate’)时被全部注销;
- 在第二参数指定为navigationId时,只有在调用传入对应的navigationId才会被注销掉。
更多关于HarmonyOS鸿蒙Next中无感监听一次注销就全部注销了,有其他方案?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,无感监听一次注销导致全部注销的问题,可以通过使用LifecycleObserver
来管理监听器的生命周期。LifecycleObserver
能够根据组件的生命周期自动注册和注销监听器,避免手动管理带来的问题。具体实现时,可以在onStart
和onStop
生命周期回调中分别注册和注销监听器,确保监听器仅在组件活跃时运行。
在HarmonyOS Next中,无感监听(observer)的off()方法会完全移除对应事件的所有监听器。针对您的问题,可以考虑以下替代方案:
- 使用命名空间区分不同业务的监听:
// 业务A注册监听
const callbackA = (event) => { /* 业务A处理逻辑 */ };
observer.on('navDestinationUpdate', callbackA);
// 业务B注册监听
const callbackB = (event) => { /* 业务B处理逻辑 */ };
observer.on('navDestinationUpdate', callbackB);
// 业务B注销时只移除自己的监听
observer.off('navDestinationUpdate', callbackB);
- 使用事件总线替代:
// 创建不同事件通道
const eventA = new EventChannel('navUpdateA');
const eventB = new EventChannel('navUpdateB');
// 业务A监听自己的通道
eventA.on('update', (data) => { /* 处理逻辑 */ });
// 业务B监听自己的通道
eventB.on('update', (data) => { /* 处理逻辑 */ });
// 业务B可单独注销
eventB.off('update');
- 封装监听管理器:
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);
}
}
}
这些方案都能实现不同业务监听器的独立管理,避免相互影响。