鸿蒙:使用EventHub实现多模块之间的通信

前言:

官方文档上指出,EventHub是系统提供的基于发布-订阅模式实现的事件通信机制。通过事件名,实现了发送方和订阅方之间的解耦,支持不同业务模块间的高效数据传递和状态同步。

主要用于UIAbility组件与UI的数据通信。

还是老样子,在学习新知识之前,我们应当参考官方文档和示例,链接如下:

文档中心https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-inner-application-eventhub看完了文档,相信你对EventHub有了了解,那么我们就来实践演练吧。

这里就不多解释,我已经封装好了,直接上效果图和代码:

代码如下:

1、EventHubUtil.ets

复制代码
import { common } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { promptAction } from '@kit.ArkUI';

class EventHubUtil {
  context: common.UIAbilityContext = AppStorage.get('appStorage') as common.UIAbilityContext
  value: number = 0;

  eventFunc() {
    console.log('eventFunc is called');
  }

  // 订阅事件
  on() {

    try {
      // 支持使用匿名函数订阅事件
      this.context.eventHub.on('myEvent', () => {
        console.log(`anonymous eventFunc is called, value: ${this.value}`);
      });
      promptAction.showToast({ message: "订阅成功!" })
    } catch (e) {
      let code: number = (e as BusinessError).code;
      let msg: string = (e as BusinessError).message;
      console.error(`EventHub emit error, code: ${code}, msg: ${msg}`);
    }


  }

  // 发送事件
  emit() {
    this.value++
    try {
      // 结果:
      // anonymous eventFunc is called, value: 12
      this.context.eventHub.emit('myEvent');
      promptAction.showToast({ message: "发送成功!" })
    } catch (e) {
      let code: number = (e as BusinessError).code;
      let msg: string = (e as BusinessError).message;
      console.error(`EventHub emit error, code: ${code}, msg: ${msg}`);
    }
  }

  // 取消事件
  off() {
    this.context.eventHub.off('myEvent');
    promptAction.showToast({ message: "取消成功!" })
  }
}

export const eventHubUtil = new EventHubUtil();

2、Index.ets

复制代码
import { emitterUtil } from "./EmitterUtil"
import { eventHubUtil } from "./EventHubUtil"

// emitter使用示例
@Entry
@Component
export struct Index {
  build() {
    Column({ space: 20 }) {
      // Button("emitter.fire")
      //   .onClick(() => {
      //     emitterUtil.fire()
      //
      //   })
      //
      // Button("emitter.on")
      //   .onClick(() => {
      //     emitterUtil.on()
      //
      //   })
      //
      // Button("emitter.off")
      //   .onClick(() => {
      //     emitterUtil.off()
      //
      //   })


      Button("EventHub.emit")
        .onClick(() => {
          eventHubUtil.emit()
        })

      Button("EventHub.on")
        .onClick(() => {
          eventHubUtil.on()
        })

      Button("EventHub.off")
        .onClick(() => {
          eventHubUtil.off()
        })
    }
    .width("100%")
    .height("100%")
    .justifyContent(FlexAlign.Center)
    .alignItems(HorizontalAlign.Center)

  }
}

以上是个人经验分享。

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

补充一下,EntryAbility.ets中需要添加的内容:

找到onCreate方法:

复制代码
    onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
      // 存储UIAbilityContext
      AppStorage.setOrCreate('appStorage', this.context)
}
相关推荐
我是华为OD~HR~栗栗呀1 小时前
测试转C++开发面经(华为OD)
java·c++·后端·python·华为od·华为·面试
万少1 小时前
记 HarmonyOS 开发中的一个小事件 怒提华为工单
前端·harmonyos
辛宝Otto_WebWorker2 小时前
自力更生!uniapp 使用鸿蒙 UTS 使用三方依赖、本地依赖
uni-app·harmonyos
程序员潘Sir3 小时前
使用Tabs选项卡组件快速搭建鸿蒙APP框架
harmonyos·鸿蒙
编程乐学4 小时前
鸿蒙原创--DevEco Studio开发的音乐播放器App
华为·harmonyos·音乐播放器·deveco studio·大作业·鸿蒙大作业
米羊12113 小时前
【鸿蒙心迹】摸蓝图,打地基
华为·harmonyos
pangtout16 小时前
华为坤灵:点燃中小企业智能化的星火
华为
一天前18 小时前
ArkUI 中实现点击涟漪效果
harmonyos
HarmonyOS_SDK21 小时前
融合多元定位技术,帮助应用破解精准定位难题
harmonyos