文章配图:EventHub 事件总线

页面预览

前言

EventHub 是 HarmonyOS 的事件总线机制,用于组件或模块之间的松耦合通信。在「猫猫大作战」中,EventHub 用于音效播放得分变更游戏状态切换等跨组件通知。

一、EventHub 基础

import { EventHub } from '@kit.ArkUI';

// 创建 EventHub
const eventHub = new EventHub();

// 订阅事件
eventHub.on('scoreChanged', (score: number) => {
  console.info(`得分更新: ${score}`);
  // 更新 UI 等
});

// 发布事件
eventHub.emit('scoreChanged', 2450);

二、游戏中的应用

// 音效管理模块 — 订阅事件
class SFXService {
  constructor(hub: EventHub) {
    hub.on('playMerge', () => this.play('merge'));
    hub.on('playLevelUp', () => this.play('level_up'));
    hub.on('playGameOver', () => this.play('game_over'));
    hub.on('playButton', () => this.play('button'));
  }

  private play(name: string): void {
    console.info(`播放音效: ${name}`);
  }
}

// 游戏引擎 — 发布事件
class GameEngine {
  private hub: EventHub;

  constructor(hub: EventHub) {
    this.hub = hub;
  }

  onMerge(): void {
    this.hub.emit('playMerge');
  }

  onGameOver(): void {
    this.hub.emit('playGameOver');
  }
}

三、EventHub vs @State

特性EventHub@State
通信范围任意模块组件树
耦合度低(松耦合)中(父子依赖)
数据流单向事件双向绑定
调试较难追踪易追踪
适用场景跨模块通知UI 状态同步

四、最佳实践

  1. 事件命名规范playMergestateChanged 动词+名词
  2. 订阅在初始化aboutToAppear 时订阅
  3. 取消订阅hub.off('eventName') 防内存泄漏
  4. 不传递复杂对象:只传递必要的数据参数

五、事件列表

事件名数据触发时机
playMerge合并时
playLevelUp等级升级时
playGameOver得分结束时
scoreChanged得分得分变化
stateChanged状态状态切换

总结

EventHub 实现跨模块的松耦合事件通信,适合音效播放等全局通知。核心要点:hub.on() 订阅、 hub.emit() 发布、 注意取消订阅防泄漏

如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、关注🔔,你的支持是我持续创作的动力!


相关资源:

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐