Flutter for OpenHarmony:event_bus 轻量级事件总线(解耦组件通信的神器) 深度解析与鸿蒙适配指南

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net

前言

在 Flutter 开发中,状态管理(Provider, Bloc, GetX)解决了大部分组件通信问题。
通过 EventBus,我们可以实现跨组件、跨页面、甚至跨业务模块的离散事件通知(如:退出登录通知、全局主题变更、接收到推送消息)。

event_bus 是 Dart 社区最经典的事件总线库,基于 Stream 实现,简单且高效。

对于 OpenHarmony 开发者,event_bus 是一种极其廉价的解耦手段,特别是当你需要从非 UI 代码(如网络层、插件层)向 UI 层发送通知时。

一、核心原理

EventBus 本质上是一个全局的 StreamController.broadcast

fire(Event)

Listen

Listen

Listen

发布者

EventBus

订阅者 A (页面)

订阅者 B (服务)

订阅者 C (组件)

二、OpenHarmony 适配说明

event_busPure Dart 库,100% 兼容 OpenHarmony

使用禁忌
虽然 EventBus 好用,但不要滥用。不要用它来传递必须被持久化的应用状态(State),否则会让数据流变得难以追踪(Spaghetti Code)。它最适合处理“一次性”的、“广播式”的通知。

三、基础用例

3.1 定义事件

classUserLoggedInEvent{finalString username;UserLoggedInEvent(this.username);}classThemeChangedEvent{final bool isDark;ThemeChangedEvent(this.isDark);}

3.2 创建总线与发送事件

通常作为一个全局单例或通过 GetIt 注入。

import'package:event_bus/event_bus.dart';// 全局实例EventBus eventBus =EventBus();voidperformLogin(){print('登录成功...');// 发送事件 eventBus.fire(UserLoggedInEvent('WangBaolong'));}

3.3 监听事件

voidlistenToEvents(){// 监听特定类型的事件 eventBus.on<UserLoggedInEvent>().listen((event){print('收到登录通知: ${event.username}');});// 监听所有事件 eventBus.on().listen((event){print('总线收到任意事件: $event');});}
在这里插入图片描述

四、完整实战示例:鸿蒙应用全局通知

这个示例演示了如何在鸿蒙应用中,使用 EventBus 实现一个“夜间模式”切换的全局通知机制。

import'dart:async';import'package:event_bus/event_bus.dart';// 1. 定义事件classAppThemeEvent{finalString themeName;AppThemeEvent(this.themeName);}// 2. 全局总线EventBus bus =EventBus();// 3. 模拟设置页面 (发布者)classSettingsPage{voidswitchTheme(String newTheme){print('🎨 [SettingsPage] 用户切换主题为: $newTheme'); bus.fire(AppThemeEvent(newTheme));}}// 4. 模拟主页 (订阅者)classHomePage{StreamSubscription? _sub;voidinitState(){print('🏠 [HomePage] 初始化,开始监听主题变更...'); _sub = bus.on<AppThemeEvent>().listen((event){print('🏠 [HomePage] 收到主题变更: ${event.themeName}. 正在刷新 UI...');_updateUI(event.themeName);});}void_updateUI(String theme){// 省略 setState}voiddispose(){print('🏠 [HomePage] 销毁,取消监听'); _sub?.cancel();}}// 5. 模拟另一个组件 (另一个订阅者)classProfileWidget{StreamSubscription? _sub;ProfileWidget(){ _sub = bus.on<AppThemeEvent>().listen((event){print('👤 [ProfileWidget] 也收到了主题变更: ${event.themeName}');});}voiddispose()=> _sub?.cancel();}voidmain()async{// 初始化组件var home =HomePage()..initState();var profile =ProfileWidget();var settings =SettingsPage();// 模拟操作awaitFuture.delayed(Duration(seconds:1)); settings.switchTheme('Dark Mode');awaitFuture.delayed(Duration(seconds:1)); settings.switchTheme('Light Mode');//清理 home.dispose(); profile.dispose();}
在这里插入图片描述

五、总结

event_bus 在 OpenHarmony 开发中是一个非常实用的润滑剂。
它填补了组件树层级过深时通信困难的空白。

但请记住黄金法则:在组件销毁 (dispose) 时,务必取消 (cancel) 对 EventBus 的监听。否则,会导致内存泄漏,甚至在组件销毁后回调依然执行引发空指针 Crash。

Read more

【C++笔记】STL详解:String类的实现

【C++笔记】STL详解:String类的实现

前言:                 在前面的学习中,我们已经初步掌握了string类接口函数的使用方法,本文将带领大家从零开始,逐步实现一个完整的string类。          一、string类总览                 温馨提示: 为了避免与标准库中的string产生命名冲突,我们使用mystd命名空间进行封装。 namespace mystd { class string { public: //迭代器 typedef char* iterator; typedef const char* const_iterator; //默认成员函数 string(); string(const char* str); //构造函数 string(const string& s); //拷贝构造函数 string& operator=(const string& s); //赋值运算符重载函数 ~string(); //析构函数 //迭代器相关函数 iterator begin(

By Ne0inhk
基于java 员工理系统设计与实现

基于java 员工理系统设计与实现

博主介绍:翰文编程 专注于Java(springboot ssm 等开发框架) vue  .net  php phython node.js    uniapp 微信小程序 等诸多技术领域和课设项目实战、企业信息化系统建设,从业十八余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟 我的博客空间发布了2000+题目解决方法案例  方便大家学习使用 感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人 文末下方有源码获取地址 通过分析员工管理系统相似系统功能要求,总结本系统的主要功能 本系统模块实现功能如下: (1)员工管理:对员工信息进行添加、删除、修改和查看 (2)员工评语管理:对员工评语信息进行添加、删除、修改和查看 (3)奖金管理:对奖金信息进行添加、删除、修改和查看 (4)社保记录管理:对社保记录信息进行添加、删除、修改和查看

By Ne0inhk
3大关键点教你用Java和Spring Boot快速构建微服务架构:从零开发到高效服务注册与发现的逆袭之路

3大关键点教你用Java和Spring Boot快速构建微服务架构:从零开发到高效服务注册与发现的逆袭之路

你好,我是忆~遂愿,全网3w+粉丝,《遂愿盈创》社群主理人。 副业启航① | 遂愿盈创(对副业感兴趣免费可入,多种赚钱实战项目等你来,一起探寻副业快速变现的途径;以及对接互联网大厂商务合作,一起来搞点小外快,认识更多互联网大咖) 目前群里已经带很多小伙伴(大部分大学生)变现几百块啦,程序员搞副业有额外加成~ 对副业感兴趣可+V : suiyuan2ying 拉你进群。 文章目录 * 1 初入微服务架构 * 2 技术栈选型 * 3 服务注册与发现 * 3.1 Eureka Server配置 * 3.2 微服务配置 * 3.3 用户服务接口 * 4 服务调用 * 4.1 服务配置 * 4.2 服务接口 * 5 微服务架构测试

By Ne0inhk