鸿蒙:使用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)
}
相关推荐
星空真迷人18 小时前
嵌入式鸿蒙并非精简版,核心究竟是什么?
stm32·单片机·嵌入式硬件·物联网·华为·harmonyos·iot
OH_TPC1 天前
【鸿蒙优选三方库】@ohos/ijkplayer:在鸿蒙上像 B 站一样流畅播视频
华为·音视频·harmonyos·鸿蒙
2501_919749031 天前
华为鸿蒙经期记录APP—小羊月经
华为·harmonyos·鸿蒙
黑鲨吃西瓜1 天前
鸿蒙通用模块
harmonyos·鸿蒙
腾科IT教育2 天前
HarmonyOS开发|ArkTS UI颜色API通用规则
ui·华为·harmonyos·harmonyos开发·鸿蒙应用开发工程师
风华圆舞2 天前
HarmonyOS 自定义绘制实战 —— 用 ArkGraphics2D 画一个会卷曲翻动的页面网格
harmonyos·arkts·drawing·drawvertices·翻页卷曲·有限差分法线
风华圆舞2 天前
HarmonyOS 手势与 animator 实战 —— 捏出跟手又有弹性的翻页物理
harmonyos·手势·pixelmap·pangesture·边界回弹·native 句柄
北墨NoLimit2 天前
DevEco Code:在终端里用 AI 写鸿蒙应用
harmonyos
智塑未来2 天前
打开快、切换顺、游戏稳:鸿蒙的日常流畅表现
游戏·华为·harmonyos
智塑未来3 天前
鸿蒙游戏体验手册:四种能力从性能到玩法逐一解锁
游戏·华为·harmonyos