Flutter事件总线插件zevent_bus的使用
Flutter事件总线插件zevent_bus的使用
EventBus简介
zevent_bus
是一个用于在 Flutter 应用中实现事件总线功能的简单工具。它允许组件之间通过发布-订阅模式进行通信,而无需直接依赖于父组件或子组件。
使用方法
1. 添加依赖
首先,在 pubspec.yaml
文件中添加 zevent_bus
依赖:
dependencies:
zevent_bus: ^版本号
然后运行以下命令以更新依赖项:
flutter pub get
2. 创建事件监听器
示例代码:创建一个 _Text
组件,用于接收事件并更新 UI
class _Text extends StatefulWidget {
const _Text({Key? key}) : super(key: key);
[@override](/user/override)
__TextState createState() => __TextState();
}
class __TextState extends State<_Text> {
String val = ""; // 用于存储接收到的事件参数
EventRemoveCallback? _eventRemoveCallback; // 用于移除事件监听器
[@override](/user/override)
void initState() {
super.initState();
// 注册事件监听器
_eventRemoveCallback = EventBus.instance.addListener(
eventKey: "CUS_KEY", // 定义事件标识符
callback: (arg) { // 回调函数处理事件参数
setState(() {
val = "$arg"; // 更新 UI
});
},
);
}
[@override](/user/override)
void dispose() {
// 在组件销毁时移除事件监听器
_eventRemoveCallback?.call();
super.dispose();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Text(
'$val', // 显示接收到的事件参数
style: Theme.of(context).textTheme.headline4,
);
}
}
3. 发布事件
示例代码:在按钮点击时发布事件
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
[@override](/user/override)
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
void _incrementCounter() {
_counter += 1;
// 发布事件,传递参数
EventBus.instance.commit(eventKey: "CUS_KEY", arg: "params = $_counter");
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text(
'You have pushed the button this many times:',
),
_Text(), // 显示事件参数
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: const Icon(Icons.add),
),
);
}
}
4. 完整示例代码
以下是完整的示例代码,展示如何结合事件总线进行组件间的通信:
import 'package:flutter/material.dart';
import 'package:zevent_bus/zevent_bus.dart';
void main() {
runApp(const MyApp());
}
const String CUS_KEY = "CUS_KEY";
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
[@override](/user/override)
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
void _incrementCounter() {
_counter += 1;
EventBus.instance.commit(eventKey: CUS_KEY, arg: "params = $_counter");
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text(
'You have pushed the button this many times:',
),
_Text(),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: const Icon(Icons.add),
),
);
}
}
class _Text extends StatefulWidget {
const _Text({Key? key}) : super(key: key);
[@override](/user/override)
__TextState createState() => __TextState();
}
class __TextState extends State<_Text> {
String val = "";
EventRemoveCallback? _eventRemoveCallback;
[@override](/user/override)
void initState() {
super.initState();
// 注册事件监听器
_eventRemoveCallback = EventBus.instance.addListener(
eventKey: CUS_KEY,
callback: (arg) {
setState(() {
val = "$arg";
});
},
);
}
[@override](/user/override)
void dispose() {
// 移除事件监听器
_eventRemoveCallback?.call();
super.dispose();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Text(
'$val',
style: Theme.of(context).textTheme.headline4,
);
}
}
更多关于Flutter事件总线插件zevent_bus的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter事件总线插件zevent_bus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
zevent_bus
是一个轻量级的事件总线插件,用于在 Flutter 应用中实现组件之间的通信。它允许你在不同的 Widget 或组件之间发送和接收事件,而不需要直接引用或依赖对方。
安装 zevent_bus
首先,你需要在 pubspec.yaml
文件中添加 zevent_bus
依赖:
dependencies:
flutter:
sdk: flutter
zevent_bus: ^1.0.0 # 请使用最新版本
然后运行 flutter pub get
来安装依赖。
使用 zevent_bus
1. 创建事件类
首先,你需要定义一个事件类。这个类可以包含任何你需要传递的数据。
class MyEvent {
final String message;
MyEvent(this.message);
}
2. 初始化事件总线
你可以在应用的任何地方初始化事件总线。通常,你会在 main.dart
中初始化它。
import 'package:zevent_bus/zevent_bus.dart';
final eventBus = EventBus();
3. 发送事件
你可以在任何地方使用 eventBus.fire(event)
来发送事件。
eventBus.fire(MyEvent('Hello, World!'));
4. 监听事件
你可以在需要的地方监听事件。通常,你会在 StatefulWidget
的 initState
方法中监听事件,并在 dispose
方法中取消监听。
import 'package:flutter/material.dart';
import 'package:zevent_bus/zevent_bus.dart';
class MyWidget extends StatefulWidget {
[@override](/user/override)
_MyWidgetState createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> {
late StreamSubscription<MyEvent> _subscription;
[@override](/user/override)
void initState() {
super.initState();
_subscription = eventBus.on<MyEvent>().listen((event) {
print('Received event: ${event.message}');
});
}
[@override](/user/override)
void dispose() {
_subscription.cancel();
super.dispose();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Container(
child: Text('Listening for events...'),
);
}
}
5. 取消监听
为了避免内存泄漏,你需要在 dispose
方法中取消监听。
[@override](/user/override)
void dispose() {
_subscription.cancel();
super.dispose();
}
完整示例
以下是一个完整的示例,展示了如何使用 zevent_bus
在 Flutter 应用中发送和接收事件。
import 'package:flutter/material.dart';
import 'package:zevent_bus/zevent_bus.dart';
final eventBus = EventBus();
class MyEvent {
final String message;
MyEvent(this.message);
}
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Event Bus Example')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
MyWidget(),
ElevatedButton(
onPressed: () {
eventBus.fire(MyEvent('Button Pressed!'));
},
child: Text('Send Event'),
),
],
),
),
),
);
}
}
class MyWidget extends StatefulWidget {
[@override](/user/override)
_MyWidgetState createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> {
late StreamSubscription<MyEvent> _subscription;
String _message = 'No event received yet';
[@override](/user/override)
void initState() {
super.initState();
_subscription = eventBus.on<MyEvent>().listen((event) {
setState(() {
_message = event.message;
});
});
}
[@override](/user/override)
void dispose() {
_subscription.cancel();
super.dispose();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Text(_message);
}
}