当前位置: 首页 > news >正文

Flutter 事件总线 Event Bus

文章目录

    • 概要
    • 核心原理
    • 基本使用步骤
    • 优点
    • 注意事项
    • 适用场景
    • 小结

概要

提示:这里可以添加技术概要

event_bus 是一个常用的第三方库,用于实现跨组件 / 跨页面的事件通信,基于发布 - 订阅模式(Publish-Subscribe Pattern)工作。它可以帮助你在应用的不同部分之间解耦通信,避免组件之间直接依赖。

核心原理

  1. 定义事件:创建一个类来表示特定的事件(可以携带数据)
  2. 发布事件:当某个操作发生时,通过 EventBus 实例发布一个事件
  3. 订阅事件:在需要响应事件的地方,订阅该事件并定义回调处理在这里插入代码片

基本使用步骤

1.添加依赖

dependencies:flutter:sdk: flutterevent_bus: ^2.0.0  # 请使用最新版本

2.创建 EventBus 实例
通常会创建一个全局单例,方便在应用各处使用:

import 'package:event_bus/event_bus.dart';// 创建全局事件总线
final EventBus eventBus = EventBus();

3.定义事件类
事件可以是简单的标记,也可以携带数据:

// 无数据的事件
class LoginEvent {}// 带数据的事件
class UserUpdateEvent {final String username;final int age;UserUpdateEvent({required this.username, required this.age});
}

4. 发布事件
在需要触发事件的地方发布:

// 发布登录事件
eventBus.fire(LoginEvent());// 发布带数据的事件
eventBus.fire(UserUpdateEvent(username: "张三", age: 25));

5. 订阅事件

// 订阅 LoginEvent
StreamSubscription<LoginEvent>? loginSubscription;// 订阅 UserUpdateEvent
StreamSubscription<UserUpdateEvent>? userUpdateSubscription;
void initState() {super.initState();// 订阅登录事件loginSubscription = eventBus.on<LoginEvent>().listen((event) {print("收到登录事件,执行相关操作");// 例如:更新UI、跳转页面等});// 订阅用户更新事件userUpdateSubscription = eventBus.on<UserUpdateEvent>().listen((event) {print("用户更新:${event.username}, ${event.age}");// 处理用户信息更新逻辑});
} 

6. 取消订阅
为了避免内存泄漏,在组件销毁时必须取消订阅:


void dispose() {loginSubscription?.cancel();userUpdateSubscription?.cancel();super.dispose();
}

例如:

  • Bert
  • GPT 初代
  • GPT-2
  • GPT-3
  • ChatGPT

优点

  • 解耦:组件之间无需直接引用,通过事件间接通信
  • 灵活:可以在应用的任何地方发布和订阅事件
  • 轻量:使用简单,学习成本低
  • 支持数据流:基于 Dart 的 Stream 实现,可结合 StreamBuilder 使用

注意事项

1. 内存泄漏:必须在组件销毁时取消订阅,否则会导致内存泄漏
2. 事件命名:建议给事件类起清晰的名字,方便维护
3. 事件滥用:不要过度使用事件总线,简单的父子组件通信建议用回调或 Provider
4. 线程安全:默认情况下,事件处理在发布事件的同一线程执行

适用场景

  • 跨页面通信(如:A 页面操作需要通知 B 页面更新)
  • 深层嵌套组件通信(避免回调地狱)
  • 全局状态变化通知(如:用户登录状态变化、主题切换)

小结

event_bus 是 Flutter 中实现松耦合通信的优秀方案,尤其适合中小型应用。对于大型应用,可能需要更完善的状态管理方案(如 Bloc、Provider),但 event_bus 仍可作为补充。

http://www.dtcms.com/a/313770.html

相关文章:

  • 【2025WACV-最佳论文】RayGauss:基于体积高斯的光线投射,用于逼真的小说视图合成
  • 【机器学习】(算法优化二)提升算法之:AdaBoost与随机梯度
  • Java 中 BigDecimal、Float、Double 的取整与保留小数处理方法详解
  • 从 0 到 1 开发图书管理系统:飞算 JavaAI 让技术落地更简单
  • 13.Home-面板组件封装
  • 如何设计和实施高效的向量化数据检索解决方案
  • 阿里云-通义灵码:解锁云原生智能开发新能力,让云开发更“灵”~
  • Clion STM32CubeMX LED闪灯
  • 为什么叫电磁兼容?
  • 【Java】一篇详解HashMap的扩容机制!!
  • SCI论文选词炼句(下)
  • vue3指定设置了dom元素的ref但是为null问题
  • Druid手写核心实现案例 实现一个简单Select 解析,包含Lexer、Parser、AstNode
  • 第三章 浏览器 【5. 事件】
  • Java项目:基于SSM框架实现的电子病历管理系统【ssm+B/S架构+源码+数据库+毕业论文+远程部署】
  • 前端开发(HTML,CSS,VUE,JS)从入门到精通!第五天(jQuery函数库)
  • 深入理解Java的SPI机制,使用auto-service库优化SPI
  • 打造个人数字图书馆:LeaNote+cpolar如何成为你的私有化知识中枢?
  • 【MySQL02】: MySQL类型
  • 深度学习TR3周:Pytorch复现Transformer
  • 软件测试自学之路
  • 架构师面试(三十九):微服务重构单体应用
  • 第三阶段—8天Python从入门到精通【itheima】-143节(pyspark实战——数据计算——flatmap方法)
  • RAG From Scratch 系列教程-4: Query_Construction
  • 向量空间模型
  • 开源的时间跟踪工具TimeTagger
  • PHP进阶语法详解:命名空间、类型转换与文件操作
  • 动态规划技巧:深入解析“组合总和IV”与“不同的二叉搜索树”中的卡特兰数
  • 豆包1.6+PromptPilot实战:构建智能品牌评价情感分类系统的技术探索
  • Jwts用于创建和验证 ​​JSON Web Token(JWT)​​ 的开源库详解