Flutter事件总线插件zam_event_bus_provider的使用

发布于 1周前 作者 bupafengyu 来自 Flutter

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),
),

第四步:通过 ViewStreamBuilder 监听数据

使用 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

1 回复

更多关于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();
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!