查看: 72|回复: 0

HarmonyOSNEXT—应用通信之EventHub

[复制链接]

1

主题

2

回帖

13

积分

新手上路

积分
13
发表于 2025-3-30 14:43:58 | 显示全部楼层 |阅读模式
HarmonyOSNEXT—应用通信之EventHub

序言

在应用开发过程中,我们对于应用中数据和响应事件的传递,都会选择不同的通信方式,在选择这些通信方式时,我们需要考虑不同通信方式下我们的实现逻辑,以及是否满足我们的需求,本文主要介绍,应用基于同一个上下文的通信方式
一、基于Ability的通信方式——EventHub

简介:

EventHub通过Ability实例的上下文对象来获取,主要用于同一Ability下的组件间通信,属于一种轻量级的通信方式,主要用于无复杂序列化开销的场景。
使用方式:

EventHub是基于订阅和发布的方式来触发事件响应的:
  1. // 订阅事件
  2. getContext().eventHub.on("click" , (param: string) => {
  3.   console.log("Index eventhub message: " +  param);
  4.   this.message = param
  5. })
复制代码
  1. // 发布事件
  2. getContext().eventHub.emit('click', "TestEventHubPage")
复制代码
  1. // 取消订阅
  2. getContext().eventHub.off("click")
复制代码
注意事项:取消订阅时,如果不传入callback,将取消所有订阅当前事件的回调
二、项目示例:

通过不同弹框的点击功能,在同一个页面中通过eventHub来传递弹框中的事件,主要作用是,多个页面的不同类型弹框,可以进行统一处理
  1. // index.ets
  2. import { TestDialog1 } from './component/TestDialog1';
  3. import { TestDialog2 } from './component/TestDialog2';
  4. @Entry
  5. @Component
  6. struct Index {
  7.   @State message: string = 'Hello World';
  8.   dialogController1: CustomDialogController = new CustomDialogController({
  9.     builder: TestDialog1(),
  10.     alignment: DialogAlignment.Bottom,
  11.     offset: { dx: 0, dy: -25 } })
  12.   dialogController2: CustomDialogController = new CustomDialogController({
  13.     builder: TestDialog2(),
  14.     alignment: DialogAlignment.Bottom,
  15.     offset: { dx: 0, dy: -25 } })
  16.   aboutToAppear(): void {
  17.     getContext().eventHub.on("clickEvent" , (id: number, param: string) => {
  18.       console.log("Index eventhub message: " +  param);
  19.       switch (id) {
  20.         case 0:
  21.           if (param != "close") {
  22.             this.message = param
  23.           } else {
  24.             this.dialogController1.close()
  25.           }
  26.           break;
  27.         case 1:
  28.           if (param != "close") {
  29.             this.message = param
  30.           } else {
  31.             this.dialogController2.close()
  32.           }
  33.           break;
  34.       }
  35.     })
  36.   }
  37.   build() {
  38.     Column({space: 20}) {
  39.       Text(this.message).fontSize(50).fontWeight(FontWeight.Bold).margin({top: 50})
  40.       Button("第一个弹框")
  41.         .fontSize(50)
  42.         .fontWeight(FontWeight.Bold)
  43.         .onClick(() => {
  44.           this.dialogController1.open()
  45.         })
  46.       Button("第二个弹框")
  47.         .fontSize(50)
  48.         .fontWeight(FontWeight.Bold)
  49.         .onClick(() => {
  50.           this.dialogController2.open()
  51.         })
  52.     }
  53.     .height('100%')
  54.     .width('100%')
  55.   }
  56. }
  57. // TestDialog1.ets
  58. import { common } from "@kit.AbilityKit"
  59. @CustomDialog
  60. export struct TestDialog1 {
  61.   controller: CustomDialogController
  62.   eventHub: common.EventHub = getContext().eventHub
  63.   // 间距
  64.   @State column_space: number = 35
  65.   build() {
  66.     Column({ space: this.column_space }) {
  67.       Text("dialogText1").fontSize(25)
  68.       Button("点击1").onClick(() => {
  69.         this.emitData("第一个dialog点击触发")
  70.       })
  71.       Button("关闭dialog1").onClick(() => {
  72.         this.emitData("close")
  73.       })
  74.     }
  75.     .width('100%')
  76.     .alignItems(HorizontalAlign.Center)
  77.   }
  78.   /**
  79.    * 发送dialog事件
  80.    */
  81.   private emitData(param: string) {
  82.     this.eventHub.emit('clickEvent', 0, param)
  83.   }
  84. }
  85. // TestDialog2.ets
  86. import { common } from "@kit.AbilityKit"
  87. @CustomDialog
  88. export struct TestDialog2 {
  89.   controller?: CustomDialogController
  90.   eventHub: common.EventHub = getContext().eventHub
  91.   // 间距
  92.   @State column_space: number = 35
  93.   build() {
  94.     Column({ space: this.column_space }) {
  95.       Text("dialogText2").fontSize(25)
  96.       Button("点击2").onClick(() => {
  97.         this.emitData("第二个dialog点击触发")
  98.       })
  99.       Button("关闭dialog2").onClick(() => {
  100.         this.emitData("close")
  101.       })
  102.     }
  103.     .id('deleteAlertDialog_Column')
  104.     .width('100%')
  105.     .alignItems(HorizontalAlign.Center)
  106.   }
  107.   /**
  108.    * 发送dialog事件
  109.    */
  110.   private emitData(param: string) {
  111.     this.eventHub.emit('clickEvent', 1, param)
  112.   }
  113. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表