HarmonyOS应用开发实战:猫猫大作战-EventHub 事件总线
前言
EventHub是 HarmonyOS 的事件总线机制,用于组件或模块之间的松耦合通信。在「猫猫大作战」中,EventHub 用于音效播放、得分变更、游戏状态切换等跨组件通知。
一、EventHub 基础
import{EventHub}from'@kit.ArkUI';// 创建 EventHubconsteventHub=newEventHub();// 订阅事件eventHub.on('scoreChanged',(score:number)=>{console.info(`得分更新:${score}`);// 更新 UI 等});// 发布事件eventHub.emit('scoreChanged',2450);二、游戏中的应用
// 音效管理模块 — 订阅事件classSFXService{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'));}privateplay(name:string):void{console.info(`播放音效:${name}`);}}// 游戏引擎 — 发布事件classGameEngine{privatehub: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 状态同步 |
四、最佳实践
- 事件命名规范:
playMerge、stateChanged动词+名词 - 订阅在初始化:
aboutToAppear时订阅 - 取消订阅:
hub.off('eventName')防内存泄漏 - 不传递复杂对象:只传递必要的数据参数
五、事件列表
| 事件名 | 数据 | 触发时机 |
|---|---|---|
playMerge | 无 | 合并时 |
playLevelUp | 等级 | 升级时 |
playGameOver | 得分 | 结束时 |
scoreChanged | 得分 | 得分变化 |
stateChanged | 状态 | 状态切换 |
总结
EventHub 实现跨模块的松耦合事件通信,适合音效播放等全局通知。核心要点:hub.on()订阅、hub.emit()发布、 注意取消订阅防泄漏。
如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、关注🔔,你的支持是我持续创作的动力!
相关资源:
- EventHub 官方文档
- 第 107 篇:@Extend
- 第 109 篇:startAbility
- 第 110 篇:startByType