flutter-EventBus全局事件总线

博客围绕Flutter展开,介绍了用于跨页面或组件通信的事件总线,包括其功能、用法。还阐述了单例模式,有饿汉式和懒汉式实现方式及使用注意。此外,讲解了用字典管理事件订阅者,最后对比了EventBus和Provider两种状态管理工具的特点与适用场景。

EventBus通常用于解决跨页面或跨组件通信的需求,使得组件之间的耦合度更低,代码更易于维护和扩展。

功能:

  1. 发布/订阅模式EventBus基于发布/订阅模式,组件可以订阅感兴趣的事件,当事件发生时,订阅者会收到通知并执行相应操作。

  2. 跨组件通信EventBus可以实现跨页面、跨组件的通信,使得不同组件之间能够进行数据传递和交互。

用法:

  1. 创建EventBus实例:在应用程序中创建一个全局的EventBus实例,通常可以使用第三方库如event_bus来简化创建过程。

  2. 定义事件类:定义不同类型的事件类,通常是继承自一个基类,用于标识不同的事件类型。

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

  4. 发布事件:在某个组件中发生事件时,通过EventBus实例的fire方法发布该事件,触发订阅者的回调函数执行。

示例代码如下:

// 创建全局EventBus实例
EventBus eventBus = EventBus();

// 定义事件类
class MyEvent {
   
   
  String message;
  MyEvent(this.message);
}

// 订阅事件
eventBus.on<MyEvent>().listen((event) {
   
   
  print('Received event: ${
     
     event.message}');
});

// 发布事件
eventBus.fire(MyEvent('Hello EventBus!'));

知识补充:

单例模式

单例模式是一种设计模式,用于确保一个类只有一个实例,并提供全局访问点来访问该实例。单例模式通常用于需要在整个应用程序中共享相同实例的情况,以避免多个实例的创建和资源浪费。

特点:

  1. 私有构造函数:单例类的构造函数是私有的,防止外部直接实例化该类。
  2. 静态实例:单例类内部会保存一个静态实例变量,用于存储唯一的实例。
  3. 全局访问点:提供一个静态方法来获取该实例,以便在整个应用程序中访问单例实例。

实现方式:
在Dart中,可以使用静态变量和工厂构造函数来实现单例模式,确保类只有一个实例,并通过静态方法来获取该实例。

  1. 饿汉式:在类加载时就创建单例实例,线程安全,但可能会造成资源浪费。
class Singleton {
   
   
  static final Singleton _instance = Singleton._();
  factory Singleton() => _instance;
  Singleton._();  
}
  1. 代码定义了一个静态、不可变的 _instance 变量,类型为 Singleton,并将其初始化为调用Singleton._() 构造函数创建的实例。使用了 Dart 中的静态成员和不可变变量的声明方式,确保_instance 只被初始化一次.
  2. 通过工厂构造函数来获取实例,可以确保每次调用 Singleton() 都返回同一个实例,实现单例模式的要求。
  3. 代码定义了一个私有的构造函数Singleton._(),用于创建 Singleton 类的实例。

为什么变量的类型可以为Singleton

在单例模式中,我们希望通过静态变量 _instance 来保存单例实例,因此将 _instance 的类型设置为 Singleton 可以确保 _instance 只能存储 Singleton 类的实例,从而实现单例模式的要求。
在 Dart 中,类也是一种类型,因此可以将类作为变量的类型。这样做的好处是可以限制变量只能存储特定类型的实例,从而提高代码的类型安全性。

  1. 懒汉式:在首次获取实例时创建单例实例,延迟加载,线程不安全,需要考虑线程安全性。
class Singleton {
   
   
  static Singleton? _instance;

  factory Singleton() {
   
   
    if (_instance == null) {
   
   
      _instance = Singleton._();
    }
    return _instance!;
  }

  Singleton._();
}

使用:

Singleton singleton1 = Singleton();
Singleton singleton2 = Singleton();
print(identical(singleton1
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值