首页 > 其他分享 >Flutter进阶(5):EventBus全局事件总线

Flutter进阶(5):EventBus全局事件总线

时间:2025-01-09 14:33:19浏览次数:1  
标签:订阅 进阶 eventBus event 事件 组件 EventBus Flutter

一、EventBus的基本概念

Flutter EventBus 是一种用于在 Flutter 应用程序中实现组件间通信的事件总线机制。可以用于在应用程序中实现各个组件之间的通信。它基于发布/订阅模式,允许组件订阅感兴趣的事件,并在事件发生时接收通知。

二、Flutter EventBus的工作原理

Flutter EventBus 的工作原理主要包括三个核心组件:事件、事件总线和订阅者。

  • 事件‌:事件是在应用程序中不同组件之间传递的消息对象。每个事件都是一个单独的类,它包含携带的数据和其他相关信息。
  • 事件总线‌:事件总线是事件发布和订阅的中介者。它维护了一个事件订阅者的列表,并允许发布者将事件发布到总线上。
  • 订阅者‌:订阅者是对特定事件感兴趣的组件。它们通过向事件总线注册自己,以便在事件发生时接收通知。

当发布者发布一个事件时,事件总线会将该事件广播给所有订阅了该事件的订阅者。订阅者接收到事件后,会执行相应的回调函数来处理该事件。

三、Flutter EventBus如何用于组件间通信

Flutter EventBus 通过以下步骤实现组件间通信:

(1)实例化EventBus‌:在应用程序中创建一个全局的 EventBus 实例。

(2)定义事件类‌:创建表示不同事件类型的类。

(3)订阅事件‌:在需要接收事件通知的组件中,通过 EventBus 实例的on方法订阅感兴趣的事件。

(4)发布事件‌:在某个组件中发生事件时,通过 EventBus 实例的fire方法发布该事件。

(5)处理事件‌:订阅了事件的组件会接收到通知,并执行相应的回调函数来处理该事件。

四、Flutter EventBus的使用场景

Flutter EventBus 通常用于以下场景:

  • 跨页面通信‌:在不同页面之间传递数据或通知状态变化。
  • 组件解耦‌:通过事件总线实现组件之间的松耦合,降低组件之间的依赖关系。
  • 广播机制‌:实现全局广播机制,允许多个组件同时监听和处理同一事件。

五、Flutter EventBus的优缺点及注意事项

优点‌:

  • ‌‌简化组件间通信‌:通过事件总线,可以简化组件之间的通信流程,降低代码复杂度。
  • 降低耦合度‌:事件总线实现了发布者和订阅者之间的解耦,使得组件更加独立和可维护。
  • 易于扩展‌:可以方便地添加新的事件类型和订阅者,无需修改现有代码。

缺点‌:

  • ‌‌调试困难‌:由于事件总线的异步和广播特性,可能会导致调试过程中难以追踪事件流。
  • ‌‌内存泄漏风险‌:如果订阅者没有正确取消订阅,可能会导致内存泄漏问题。

注意事项‌:

  • 避免滥用‌:虽然 EventBus 提供了一种方便的组件间通信方式,但应避免滥用导致代码结构混乱。
  • 正确管理订阅‌:确保在组件销毁时取消订阅,避免内存泄漏。
  • 合理设计事件类型‌:合理设计事件类型,避免事件过于复杂或冗余。

六、基本示例:处理多种类型的事件

先导入EventBus依赖:

dependencies:
  event_bus: ^2.0.0

(1)实例化EventBus‌:在应用程序中创建一个全局的 EventBus 实例。

import 'package:event_bus/event_bus.dart';

// 全局 EventBus 对象
EventBus eventBus = EventBus();

(2)定义事件类‌:创建表示不同事件类型的类。

// 定义事件类

// 定义登录事件
class LoginEvent {
  final String username;
  LoginEvent(this.username);
}

// 定义注销事件
class LogoutEvent {}

// 定义消息事件
class MessageEvent {
  final String message;
  MessageEvent(this.message);
}

(3)订阅事件‌:在需要接收事件通知的组件中,通过 EventBus 实例的on方法订阅感兴趣的事件。

void main() {
  // 订阅事件:LoginEvent
  eventBus.on<LoginEvent>().listen((event) {
    debugPrint("User logged in: ${event.username}");
  });

  // 订阅事件:LogoutEvent
  eventBus.on<LogoutEvent>().listen((_) {
    debugPrint("User logged out");
  });

  // 订阅事件:MessageEvent
  eventBus.on<MessageEvent>().listen((event) {
    debugPrint("Message received: ${event.message}");
  });
}

(4)发布事件‌:在某个组件中发生事件时,通过 EventBus 实例的fire方法发布该事件。

void main() {
  // ......

  // 模拟发布事件
  eventBus.fire(LoginEvent("JohnDoe"));
  eventBus.fire(MessageEvent("Hello, EventBus!"));
  eventBus.fire(LogoutEvent());
}

(5)处理事件‌:订阅了事件的组件会接收到通知,并执行相应的回调函数来处理该事件。即下面的listen监听函数:

eventBus.on<LoginEvent>().listen((event) {
  debugPrint("User logged in: ${event.username}");
});

全部代码如下:

import 'package:flutter/material.dart';
import 'package:event_bus/event_bus.dart';

// 全局 EventBus 对象
EventBus eventBus = EventBus();

// 定义事件类

// 定义登录事件
class LoginEvent {
  final String username;
  LoginEvent(this.username);
}

// 定义注销事件
class LogoutEvent {}

// 定义消息事件
class MessageEvent {
  final String message;
  MessageEvent(this.message);
}

void main() {
  // 订阅事件:LoginEvent
  eventBus.on<LoginEvent>().listen((event) {
    debugPrint("User logged in: ${event.username}");
  });

  // 订阅事件:LogoutEvent
  eventBus.on<LogoutEvent>().listen((_) {
    debugPrint("User logged out");
  });

  // 订阅事件:MessageEvent
  eventBus.on<MessageEvent>().listen((event) {
    debugPrint("Message received: ${event.message}");
  });

  // 模拟发布事件
  eventBus.fire(LoginEvent("JohnDoe"));
  eventBus.fire(MessageEvent("Hello, EventBus!"));
  eventBus.fire(LogoutEvent());  
}

输出:

flutter: User logged in: JohnDoe
flutter: Message received: Hello, EventBus!
flutter: User logged out

七、常见问题

(1) 如何确保事件处理的顺序?

  • 默认情况下,EventBus 按照事件发布的顺序依次触发订阅者。
  • 如果需要并发或异步处理,可以在订阅逻辑中使用 Future 或 Stream。

(2) 订阅者是否会收到所有事件?

不会,只有订阅的事件类型匹配时,订阅者才会被触发。例如:

eventBus.on<LoginEvent>()只会响 LoginEvent


(3) 多个订阅者对同一个事件类型的处理?

一个事件可以被多个订阅者响应,每个订阅者的处理逻辑互不干扰。


(4) 是否支持动态事件类型?

支持,但不推荐。例如:

eventBus.on<dynamic>().listen((event) {
  debugPrint("Event received: $event");
});

这样会导致所有事件都被接收,难以管理。


参考:

Flutter EventBus_eventbus 取消订阅 flutter-CSDN博客


标签:订阅,进阶,eventBus,event,事件,组件,EventBus,Flutter
From: https://www.cnblogs.com/linuxAndMcu/p/18662082

相关文章

  • 【AIGC-ChatGPT进阶提示词指令】职场老油条的生存智慧:化解办公室困境的艺术
    引言在现代职场中,每个人都可能遇到各种挑战和困境。从项目管理的突发变更,到薪资谈判的微妙博弈,再到功劳归属的争议,这些都考验着职场人的智慧和情商。本文将通过实际案例,深入剖析职场常见困境的应对之道,助你在职场中游刃有余。最近比较忙,可能更新不及时,这两天忙完就恢复......
  • 【AIGC-ChatGPT进阶提示词指令】解析职场人群的心理密码
    今天逛某瓣,发现有人分享了一个【人生四季照片】,挺有意思的,然后就结合咱们的工作,想着能不能把【职业也进行四季的具象化】,所以就有了这篇文章。引言在当代职场中,每个专业领域都如同一个独特的小宇宙,塑造着从业者特定的思维方式、行为模式和情感体验。本文将深入剖析金融投......
  • 【AIGC-ChatGPT进阶提示词指令】AI美食助手的设计与实现:Lisp风格系统提示词分析
    引言在人工智能助手的应用领域中,美食烹饪是一个既专业又贴近生活的方向。本文将详细分析一个基于Lisp风格编写的美食助手系统提示词,探讨其结构设计、功能实现以及实际应用效果。提出你的菜系,为你分析,并生成图片卡片提示词在最下方效果图系统架构设计核心角色定......
  • 让 AI 更懂你:微调、RLHF、强化学习微调和偏好微调,大模型训练的“进阶秘籍”
    以ChatGPT为代表的大语言模型(LLM)展现出了惊人的能力,能写诗、作画、编代码,甚至和你聊天谈心。但你知道这些聪明的AI模型是如何炼成的吗?除了海量数据的“喂养”之外,还需要一些特殊的训练技巧,才能让它们更好地理解和执行我们的指令。(关注公众号“AI演进”,获取更多AI知识)1.微......
  • SQL进阶实战技巧:即时订单比例问题
    目录0需求描述1数据准备2问题分析3小结往期精彩0需求描述订单配送中,如果期望配送日期和下单日期相同,称为即时订单,如果期望配送日期和下单日期不同,称为计划订单。请从配送信息表(delivery_info)中求出每个用户的首单(用户的第一个订单)中即时订单的比例,保留两位......
  • SQL进阶实战技巧:销售订单首购和次购分析?
    目录0场景描述1数据准备商品信息表订单信息表订单明细表2代码实现3小结问题扩展:同期商品售卖分析表往期精彩0场景描述通过商品信息表(sku_info)订单信息表(order_info)订单明细表(order_detail)分析如果有一个用户成功下单两个及两个以上的购买成功的手机订单(购买......
  • Java进阶__抽象、内部类
    抽象类和抽象方法抽象方法使用abstract关键字修饰的没有方法体的方法称为抽象方法。抽象方法必须在子类中被实现,否则子类也需要声明为抽象类。包含抽象方法的类称为抽象类。抽象类不能被实例化,不能通过new关键字创建对象。抽象类的特点抽象类可以包含属性、方法以及......
  • Java进阶__String类
    在Java中,String类用于表示一串字符序列。String是一个对象类,又被设计为不可变类(immutableclass)。String类在Java中提供了多种处理字符串的方法,还对性能进行了优化。1.特点不可变性:String对象是不可变的,意味着一旦一个String对象被创建,它的值不能被更改(在string类里......
  • Flutter使用ScrollBar设置thumbVisibility属性出现Another exception was thrown: The
    ══╡EXCEPTIONCAUGHTBYSCHEDULERLIBRARY╞═════════════════════════════════════════════════════════Thefollowingassertionwasthrownduringaschedulercallback:TheScrollbar'sScrollController......
  • 2025年网络安全学习指南!详尽路线图,从零基础到黑客高手的进阶之路!
    零基础小白,到就业!入门到入土的网安/黑客学习路线!建议的学习顺序:一、网络安全学习普法(心里有个数,要进去坐几年!)1、了解并介绍《网络安全法》2、《全国人大常委会关于维护互联网安全的决定》3、《中华人民共和国计算机信息系统安全保护条例(2011年修正)》4、《中华人民共......