Flutter事件总线插件zam_event_bus_provider的使用
Flutter事件总线插件zam_event_bus_provider的使用
在Flutter中,zam_event_bus_provider
是一个用于传递 EventBus
的 Provider 插件。它扩展了 zam_event_bus
包的功能,使开发者能够更方便地通过上下文(Context)分发和监听事件。
包含的核心组件
该包包含以下核心组件:
- EventBusProvider:用于将
EventBus
提供给所有子部件。
使用步骤
第一步:创建一个 EventBus
final bus = EventBus(transformers);
EventBus
来自 zam_event_bus
包。
第二步:提供 EventBus
final app = EventBusProvider(
bus: bus,
child: MaterialApp(
home: MyHomePage(title: 'Event Bus Demo'),
),
);
runApp(app);
在 MaterialApp
前添加 EventBusProvider
,以便其对所有路由可用。
第三步:通过上下文分发事件
FloatingActionButton(
onPressed: () => context.dispatch(IncrementEvent()),
tooltip: 'Increment',
child: const Icon(Icons.add),
),
第四步:通过 View
或 StreamBuilder
监听数据
使用 View
组件
View<Counter>(
builder: (data) => Text(
data.value.toString(),
style: Theme.of(context).textTheme.headline4,
),
)
使用 StreamBuilder
StreamBuilder<Counter>(
initialData: context.fetch<Counter>(),
stream: context.select<Counter>(),
builder: (context, snapshot) {
final counterText = snapshot.data!.value.toString();
return Text(
counterText,
style: Theme.of(context).textTheme.headline4,
);
},
)
或者通过继承 DataWidget
class CounterText extends DataWidget<Counter> {
[@override](/user/override)
Widget buildUsingData(BuildContext context, Counter data) {
return Text(
'Inheritance: ${data.value.toString()}',
style: Theme.of(context).textTheme.headline4,
);
}
}
完整示例代码
以下是完整的示例代码,展示如何使用 zam_event_bus_provider
插件。
import 'package:flutter/material.dart';
import 'package:zam_event_bus_provider/zam_event_bus_provider.dart';
import 'package:zam_event_bus/zam_event_bus.dart';
// 定义领域模型
class Counter {
final int value;
const Counter([this.value = 0]);
Counter increment() => Counter(value + 1);
}
// 定义事件
class IncrementEvent {}
// 定义事件处理器
class IncrementUseCase extends SavingEventTransformer<IncrementEvent, Counter> {
[@override](/user/override)
Counter execute(IncrementEvent event, EventBus bus) {
final currentCounter = bus.selectFromStore<Counter>();
final newCounter = currentCounter.increment();
return newCounter;
}
}
void main() {
// 创建 EventBus 并设置事件处理器
final transformers = [IncrementUseCase()];
final bus = EventBus(transformers);
// 初始化初始数据
bus.save(const Counter());
// 将 EventBus 提供给应用
runApp(MyApp(bus));
}
class MyApp extends StatelessWidget {
final EventBus bus;
const MyApp(this.bus, {Key? key}) : super(key: key);
[@override](/user/override)
Widget build(BuildContext context) {
return EventBusProvider(
bus: bus,
child: const MaterialApp(
home: HomePage(title: 'Event Bus Demo'),
),
);
}
}
class HomePage extends StatelessWidget {
final String title;
const HomePage({Key? key, required this.title}) : super(key: key);
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text(title)),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
// 显示计数器文本
const Text('你点击按钮的次数为:'),
// 使用继承的方式监听数据
const CounterText(),
// 使用组合的方式监听数据
View<Counter>(
builder: (data) => Text(
'组合方式: ${data.value.toString()}',
style: Theme.of(context).textTheme.headline4,
),
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: () => context.dispatch(IncrementEvent()),
tooltip: '增加',
child: const Icon(Icons.add),
),
);
}
}
// 继承 DataWidget 来监听数据
class CounterText extends DataWidget<Counter> {
const CounterText({Key? key}) : super(key: key);
[@override](/user/override)
Widget buildUsingData(BuildContext context, Counter data) {
return Text(
'继承方式: ${data.value.toString()}',
style: Theme.of(context).textTheme.headline4,
);
}
}
更多关于Flutter事件总线插件zam_event_bus_provider的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter事件总线插件zam_event_bus_provider的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
zam_event_bus_provider
是一个用于 Flutter 的事件总线插件,它允许你在应用程序的不同部分之间传递事件。使用这个插件可以简化组件之间的通信,尤其是在没有直接父子关系的组件之间。
以下是如何使用 zam_event_bus_provider
的基本步骤:
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 zam_event_bus_provider
的依赖:
dependencies:
flutter:
sdk: flutter
zam_event_bus_provider: ^latest_version
然后运行 flutter pub get
来安装依赖。
2. 创建事件
在使用事件总线之前,你需要定义事件类。事件类可以是一个简单的数据类,用于携带数据。
class MyEvent {
final String message;
MyEvent(this.message);
}
3. 初始化事件总线
在应用程序的入口处(通常是 main.dart
),初始化事件总线并提供给整个应用程序。
import 'package:flutter/material.dart';
import 'package:zam_event_bus_provider/zam_event_bus_provider.dart';
void main() {
final eventBus = EventBus();
runApp(
EventBusProvider(
eventBus: eventBus,
child: MyApp(),
),
);
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Event Bus Example',
home: HomePage(),
);
}
}
4. 发送事件
在需要发送事件的地方,你可以通过 EventBusProvider.of(context)
获取事件总线实例,然后调用 fire
方法发送事件。
class HomePage extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Event Bus Example'),
),
body: Center(
child: ElevatedButton(
onPressed: () {
final eventBus = EventBusProvider.of(context);
eventBus.fire(MyEvent('Hello from HomePage!'));
},
child: Text('Send Event'),
),
),
);
}
}
5. 监听事件
在需要监听事件的地方,你可以通过 EventBusProvider.of(context)
获取事件总线实例,然后调用 on
方法来监听特定类型的事件。
class AnotherPage extends StatefulWidget {
[@override](/user/override)
_AnotherPageState createState() => _AnotherPageState();
}
class _AnotherPageState extends State<AnotherPage> {
StreamSubscription<MyEvent> _subscription;
String _message = '';
[@override](/user/override)
void initState() {
super.initState();
final eventBus = EventBusProvider.of(context);
_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 Scaffold(
appBar: AppBar(
title: Text('Another Page'),
),
body: Center(
child: Text(_message),
),
);
}
}
6. 处理事件
在上面的代码中,_AnotherPageState
监听了 MyEvent
事件,并在事件发生时更新了 _message
状态,从而在 UI 中显示事件的内容。
7. 取消监听
为了避免内存泄漏,记得在 dispose
方法中取消监听。
[@override](/user/override)
void dispose() {
_subscription.cancel();
super.dispose();
}