Flutter事件总线插件typed_bus的使用
Flutter事件总线插件typed_bus的使用
TypedBus (tB)
TypedBus (tB) 和 TypedBusEvents (tBE) 为 Dart 应用程序提供了一个强大的、类型安全的事件总线。通过 TypedBus,您可以发布和订阅强类型的事件,确保应用程序不同部分之间的通信安全。
此库提供了编译时和运行时的安全性,允许开发者编写干净且可预测的事件驱动代码。
特性
- 🎯 类型安全的事件处理:事件与特定的数据类型关联,确保仅传递有效的负载。
- ⚡ 动态事件注册:使用
tBE
动态注册新事件及其类型。 - 🔔 订阅管理:订阅事件并监听类型化的数据。
- 📤 发布事件:全局发布强类型的事件。
- 🛡️ 错误处理:在发布和订阅期间保护类型不匹配的情况。
安装
将包添加到您的 pubspec.yaml
文件中:
dependencies:
typed_bus: ^1.0.0
然后获取包:
flutter pub get
入门指南
1. 注册事件
在发布或订阅之前,使用 tBE.registerEvent
注册事件及其预期的负载类型:
tBE.registerEvent<String>('event1');
2. 订阅事件
使用 tB.subscribe
来监听特定事件。订阅者接收的负载类型与注册类型一致:
tB.subscribe<String>('event1').listen((String data) {
print('Received Event 1: $data');
});
3. 发布事件
使用 tB.publish
发送全局事件及其对应的负载:
tB.publish<String>('event1', "Hello world!");
4. 错误处理
如果您尝试发布或订阅不匹配的类型,库将在运行时抛出异常。特别注意泛型如 Map
的类型一致性。
类型不匹配的示例
tB.publish<String>('action3', SomethingCrazy(
options: {},
option1: true,
option2: false,
option3: true,
option4: false,
));
// 抛出异常:类型不匹配
API 参考
TypedBusEvents (TBE)
注册一个事件
tBE.registerEvent<T>(String event);
- 注册一个新的事件,指定负载类型
<T>
。
示例
tBE.registerEvent<String>('my_event');
TypedBus (TB)
订阅一个事件
Stream<T> tB.subscribe<T>(String event);
- 订阅一个事件并监听类型为
<T>
的负载。
发布一个事件
void tB.publish<T>(String event, T data);
- 发布一个全局事件,带有给定的负载。
示例用法
import 'package:typed_bus/typed_bus.dart';
void main() {
// 注册事件
tBE.registerEvent<String>('eventName');
// 订阅事件
tB.subscribe<String>('eventName').listen((data) {
print('Received eventName: $data');
});
// 发布事件
tB.publish<String>('eventName', 'Hello world!');
}
高级用法
自定义类型
对于具有自定义类型的事件,直接使用即可。
定义自定义类型
class TodoItem {
String description;
bool isDone;
TodoItem({required this.description, required this.isDone});
@override
String toString() {
return 'TodoItem(description: $description, isDone: $isDone)';
}
}
使用自定义类型
tBE.registerEvent<TodoItem>("toggle");
tB.subscribe<TodoItem>('toggle').listen((TodoItem item) {
// 对项目进行操作
toggleItem(item);
});
tB.publish<TodoItem>(
'toggle', TodoItem(description: "Publish Toggle Event", isDone: false));
动态负载
对于负载类型不固定的事件,可以使用 dynamic
:
tBE.registerEvent<dynamic>('dynamic_event');
tB.subscribe<dynamic>('dynamic_event').listen((data) {
print('动态事件接收到: $data');
});
tB.publish<dynamic>('dynamic_event', {'key': 'value'});
tB.publish<dynamic>('dynamic_event', 12345);
更多关于Flutter事件总线插件typed_bus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter事件总线插件typed_bus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用typed_bus
事件总线插件的一个代码示例。typed_bus
是一个用于Flutter的事件总线库,它允许你在应用程序的不同部分之间发送和接收事件,同时保持类型安全。
1. 添加依赖
首先,你需要在pubspec.yaml
文件中添加typed_bus
依赖:
dependencies:
flutter:
sdk: flutter
typed_bus: ^x.y.z # 请替换为最新版本号
然后运行flutter pub get
来安装依赖。
2. 定义事件类型
接下来,你需要定义你想要传递的事件类型。例如,我们可以定义一个简单的CounterEvent
:
// counter_event.dart
class CounterEvent {
final int count;
CounterEvent({required this.count});
}
3. 创建事件总线
然后,你需要创建一个事件总线实例。通常,你会在一个全局可访问的地方创建这个实例,比如一个单例类:
// event_bus.dart
import 'package:typed_bus/typed_bus.dart';
import 'counter_event.dart';
class EventBus {
static final EventBus _instance = EventBus._internal();
final TypedBus<CounterEvent> _bus = TypedBus<CounterEvent>();
factory EventBus() => _instance;
EventBus._internal();
void fire(CounterEvent event) {
_bus.fire(event);
}
Stream<CounterEvent> listen() {
return _bus.listen();
}
}
4. 触发事件
在你的应用程序中的某个地方,你可以触发一个事件。例如,在一个按钮点击事件中:
// main.dart (部分代码)
import 'package:flutter/material.dart';
import 'event_bus.dart';
import 'counter_event.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Flutter Typed Bus Example')),
body: Center(
child: MyButton(),
),
),
);
}
}
class MyButton extends StatelessWidget {
final EventBus _eventBus = EventBus();
@override
Widget build(BuildContext context) {
return ElevatedButton(
onPressed: () {
_eventBus.fire(CounterEvent(count: 42));
},
child: Text('Fire Event'),
);
}
}
5. 监听事件
最后,在你想监听事件的组件中,你可以订阅事件流:
// counter_listener.dart
import 'package:flutter/material.dart';
import 'event_bus.dart';
import 'counter_event.dart';
class CounterListener extends StatefulWidget {
@override
_CounterListenerState createState() => _CounterListenerState();
}
class _CounterListenerState extends State<CounterListener> {
String _message = 'No event received';
@override
void initState() {
super.initState();
final EventBus _eventBus = EventBus();
_eventBus.listen().listen((event) {
setState(() {
_message = 'Received event with count: ${event.count}';
});
});
}
@override
Widget build(BuildContext context) {
return Center(
child: Text(_message),
);
}
}
6. 整合组件
现在,你可以将监听器组件添加到你的主应用程序中:
// main.dart (完整代码)
import 'package:flutter/material.dart';
import 'event_bus.dart';
import 'counter_event.dart';
import 'counter_listener.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Flutter Typed Bus Example')),
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Center(
child: MyButton(),
),
SizedBox(height: 20),
CounterListener(),
],
),
),
);
}
}
class MyButton extends StatelessWidget {
final EventBus _eventBus = EventBus();
@override
Widget build(BuildContext context) {
return ElevatedButton(
onPressed: () {
_eventBus.fire(CounterEvent(count: 42));
},
child: Text('Fire Event'),
);
}
}
这个示例展示了如何在Flutter中使用typed_bus
插件来创建、触发和监听事件。通过这种方式,你可以轻松地在应用的不同部分之间传递数据,同时保持类型安全和代码的清晰。