鸿蒙开发EventBus

153 阅读1分钟
鸿蒙开发EventBus

鸿蒙没有EventBus这个库,有emitter这个通知库。

一、吐槽:虽然emitter能做EventBus功能,但是它存在的坑,真的用了才知道,能不用它就不用吧

坑的点:

  1. 一个注销,其他地方用到了这个id都会被注销掉
  2. 如果不注销,多次进这个page,会重复注册,这个通知里面执行的东西就会多次执行
  3. 基于第2点,如果你打开多个同个page,它等同于多次注册,那你每个page的通知就会执行多次。这是灾难级的
  4. 如果不注销,就算你的page关闭,它还是会执行的
它的用法我就不说了,自己去官网看看

developer.huawei.com/consumer/cn…

二、 针对它的坑的解决方案

其实最好的是它和EventBus一样,和page绑定最好的。page之间不要互相影响 解决方案: 同一事件定一组集合出来,相同事件,通知集合中的所有注册了的事件

部分代码:

定义一个事件

static HomeFilterEvents:emitter.InnerEvent[] = []
static readonly HOME_FILTER_EVENT : emitter.InnerEvent = {
    eventId:10001
  }

往集合里面添加

static registerEvent(events:emitter.InnerEvent[],typeEventId:number,eventId:number,callback?: (event:emitter.EventData)=>void){
    let isExist = false
    if (events && events.length > 0) {
      for (let i = events.length-1;i>= 0;i--){
        if (events[i].eventId - typeEventId === eventId) {
          // 先注销一次,再注册
          emitter.off(typeEventId+eventId)
          emitter.on({eventId: typeEventId+eventId}, (event) => { callback?.(event) })
          isExist = true
          break
        }
      }
    }

    if (!isExist){
      events.push({eventId: typeEventId+eventId})
      emitter.on({eventId: typeEventId+eventId}, (event) => { callback?.(event) })
    }
  }

发送事件

  /**
   * @desc : 发送通知,同一类型也就同一个通知,全部发送
   * @author : congge on 2024-09-11 10:49
   **/
  static postEvent(events:emitter.InnerEvent[],data?: emitter.EventData){
    if (events && events.length > 0){
      events.forEach((value)=>{
        emitter.emit(value,data)
      })
    }
  }

需要完整处理代码的可私信我