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

【Linux】进程调度算法、进程切换、环境变量

【Linux】进程调度算法、进程切换、环境变量

前言 这篇文章聚焦 Linux 的进程调度算法、进程切换与环境变量:拆解调度规则如何分配 CPU 资源,解析进程切换的底层步骤,梳理环境变量对程序运行的影响,帮你理清这些机制在系统中的核心作用。 ⚙️ Linux 进程篇 【 冯诺依曼体系 + 操作系统 】 【 进程概念 + PID + fork函数 】 【 进程状态 】 【 进程优先级 】 目录 ------------进程调度------------ 1、进程调度概念 2、位图(bitmap)中位的定位与状态判断 3、进程调度流程 ------------进程切换------------ 1、进程切换概念 2、进程上下文是什么? 3、cpu中的寄存器是什么? 【问题】:为什么函数返回值会被外部拿到? 【问题】:系统如何知道进程当前执行到哪行代码? 4、如何进行进程切换? 【小故事】:学生当兵 【进程切换核心步骤】 ------------环境变量------------ 1、环境变量概念 2、

By Ne0inhk
Linux红帽:RHCSA认证知识讲解(十 二)调试 SELinux,如何管理 SELinux 的运行模式、安全策略、端口和上下文策略

Linux红帽:RHCSA认证知识讲解(十 二)调试 SELinux,如何管理 SELinux 的运行模式、安全策略、端口和上下文策略

Linux红帽:RHCSA认证知识讲解(十 二)调试 SELinux,如何管理 SELinux 的运行模式、安全策略、端口和上下文策略 * 前言 * 一、SELinux 简介 * 二、SELinux 的运行模式 * 2.1 查看和切换 SELinux 模式 * 三、SELinux 预设安全策略的开关控制 * 四、管理 SELinux 安全端口开放策略 * 五、管理 SELinux 安全上下文策略 * 六、修改 firewalld 防火墙策略 * 七、真题带练 * 答案 * 逐行讲解 前言 * 在红帽 Linux 系统的管理工作中,SELinux 的调试和管理是系统管理员经常会遇到的重要任务。 * 这些任务对于保障系统的安全性和稳定性起着关键作用。 * 本文将深入且详细地讲解如何调试

By Ne0inhk

AMD MI50 在Ubuntu 24.04下安装驱动和ROCm

MI50,千元能买到的HBM2 32G显存图形加速卡 目前这个GCN架构已经是淘汰架构了,只有CDNA(Compute DNA 专业级)和RDNA(Radeon DNA 消费级)才能安装最新的ROCm。这一代架构最后支持的版本为6.3.x。 目前推荐安装在系统Ubuntu24.04,有专门的驱动。 逐条执行以下命令: sudo apt update sudo apt install "linux-headers-$(uname -r)" "linux-modules-extra-$(uname -r)" sudo apt install python3-setuptools python3-wheel sudo usermod -a -G render,video $LOGNAME wget https:

By Ne0inhk
【Linux指南】Linux命令行进度条实现原理解析

【Linux指南】Linux命令行进度条实现原理解析

引言 在Linux命令行环境中,进度条是一种直观展示任务执行进度的重要方式。 本文将通过一个简单的C语言进度条程序,深入解析其实现原理和优化过程。 文章目录 * 引言 * 进度条基础原理 * 基础版进度条实现 * 解耦与通用化设计 * 回调机制与业务集成 * 进阶优化思路 * 总结 进度条基础原理 进度条的核心功能是将一个耗时操作的完成情况以可视化的方式展示给用户。在命令行环境中,我们通常使用字符界面来实现这一功能。 一个基本的进度条需要包含以下元素: * 进度指示条:通常用字符填充表示已完成部分 * 百分比数值:精确显示当前完成比例 * 动画效果:通过字符变化提供视觉反馈 * 动态刷新:实时更新显示内容 基础版进度条实现 我们先来看第一个版本的进度条实现: // process.h#pragmaonce#include<stdio.h>//v1voidprocess(); // process.c (v1部分)#include"process.h"#include<string.h>

By Ne0inhk