EventBus通常用于解决跨页面或跨组件通信的需求,使得组件之间的耦合度更低,代码更易于维护和扩展。
功能:
-
发布/订阅模式:
EventBus基于发布/订阅模式,组件可以订阅感兴趣的事件,当事件发生时,订阅者会收到通知并执行相应操作。 -
跨组件通信:
EventBus可以实现跨页面、跨组件的通信,使得不同组件之间能够进行数据传递和交互。
用法:
-
创建EventBus实例:在应用程序中创建一个全局的
EventBus实例,通常可以使用第三方库如event_bus来简化创建过程。 -
定义事件类:定义不同类型的事件类,通常是继承自一个基类,用于标识不同的事件类型。
-
订阅事件:在需要接收事件通知的组件中,通过
EventBus实例的on方法订阅感兴趣的事件。 -
发布事件:在某个组件中发生事件时,通过
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!'));
知识补充:
单例模式
单例模式是一种设计模式,用于确保一个类只有一个实例,并提供全局访问点来访问该实例。单例模式通常用于需要在整个应用程序中共享相同实例的情况,以避免多个实例的创建和资源浪费。
特点:
- 私有构造函数:单例类的构造函数是私有的,防止外部直接实例化该类。
- 静态实例:单例类内部会保存一个静态实例变量,用于存储唯一的实例。
- 全局访问点:提供一个静态方法来获取该实例,以便在整个应用程序中访问单例实例。
实现方式:
在Dart中,可以使用静态变量和工厂构造函数来实现单例模式,确保类只有一个实例,并通过静态方法来获取该实例。
- 饿汉式:在类加载时就创建单例实例,线程安全,但可能会造成资源浪费。
class Singleton {
static final Singleton _instance = Singleton._();
factory Singleton() => _instance;
Singleton._();
}
- 代码定义了一个静态、不可变的
_instance变量,类型为Singleton,并将其初始化为调用Singleton._()构造函数创建的实例。使用了 Dart 中的静态成员和不可变变量的声明方式,确保_instance只被初始化一次.- 通过工厂构造函数来获取实例,可以确保每次调用
Singleton()都返回同一个实例,实现单例模式的要求。- 代码定义了一个私有的构造函数
Singleton._(),用于创建Singleton类的实例。
为什么变量的类型可以为Singleton
在单例模式中,我们希望通过静态变量
_instance来保存单例实例,因此将_instance的类型设置为Singleton可以确保_instance只能存储Singleton类的实例,从而实现单例模式的要求。
在 Dart 中,类也是一种类型,因此可以将类作为变量的类型。这样做的好处是可以限制变量只能存储特定类型的实例,从而提高代码的类型安全性。
- 懒汉式:在首次获取实例时创建单例实例,延迟加载,线程不安全,需要考虑线程安全性。
class Singleton {
static Singleton? _instance;
factory Singleton() {
if (_instance == null) {
_instance = Singleton._();
}
return _instance!;
}
Singleton._();
}
使用:
Singleton singleton1 = Singleton();
Singleton singleton2 = Singleton();
print(identical(singleton1

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

被折叠的 条评论
为什么被折叠?



