Flutter事件总线插件easy_event_bus的使用

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

Flutter事件总线插件easy_event_bus的使用

easy_event_bus 是一个基于事件总线模式的简单易用的Flutter插件。它简化了应用程序中组件之间的通信,尤其适合解耦MVC或MVP架构的应用。

关于事件总线

事件总线遵循发布/订阅模式,允许监听者订阅事件,发布者触发事件。这使得对象之间可以交互而不需要显式定义监听器并跟踪它们。对于多个MVC组之间的通信,事件总线模式可以减少控制器之间的紧密耦合。

使用步骤

第一步:订阅事件

首先设置对所需事件的订阅,以便在事件触发时进行监听和响应。

EasyEventBus.on('sayHello', (event) {
  print(event); // 在此处编写您的代码
});

第二步:触发事件

在适当的时候触发事件,通知所有订阅者。

EasyEventBus.fire('sayHello', 'hello world'); // 触发带有数据的事件

注意:事件数据可以是任何类型,为您提供传递给订阅者的灵活性。

高级功能

1. 取消订阅

要取消订阅,您可以调用 cancel 方法。

取消所有 ‘sayHello’ 事件的订阅:

EasyEventBus.cancel('sayHello');

取消特定订阅

首先需要创建带有标识符(id)的订阅,然后通过相同的 id 调用 cancel 方法来取消该特定订阅。

订阅带有ID的事件:

EasyEventBus.on('sayHello', (event) {
  print('Received: $event');
}, id: 'uniqueId123');

通过ID取消订阅:

EasyEventBus.cancel('sayHello', id: 'uniqueId123');

2. 取消所有订阅

调用 cancelAll 方法可以取消所有订阅,并关闭所有事件控制器。

EasyEventBus.cancelAll();

示例Demo

以下是一个完整的示例demo,演示如何在Flutter应用中使用 easy_event_bus

import 'package:easy_event_bus/easy_event_bus.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  [@override](/user/override)
  MyAppState createState() => MyAppState();
}

class MyAppState extends State<MyApp> {
  final String _eventId = 'uniqueEvent';
  final String _subscriptionId = 'uniqueSubscriptionId';

  void _subscribeEvent() {
    EasyEventBus.on(_eventId, (event) {
      print('General Subscription: Event received: $event');
    });
  }

  void _subscribeEventWithId() {
    EasyEventBus.on(_eventId, (event) {
      print('Subscription with ID ($_subscriptionId): Event received: $event');
    }, id: _subscriptionId);
  }

  void _fireEvent() {
    EasyEventBus.fire(_eventId, 'Hello from EventBus!');
  }

  void _cancelSpecificSubscription() {
    EasyEventBus.cancel(_eventId, id: _subscriptionId);
  }

  void _cancelSubscriptionWithoutId() {
    EasyEventBus.cancel(_eventId);
  }

  void _cancelAllSubscriptions() {
    EasyEventBus.cancelAll();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('EasyEventBus Demo'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: _subscribeEvent,
                child: const Text('Subscribe to Event'),
              ),
              ElevatedButton(
                onPressed: _subscribeEventWithId,
                child: const Text('Subscribe to Event With ID'),
              ),
              ElevatedButton(
                onPressed: _fireEvent,
                child: const Text('Fire Event'),
              ),
              ElevatedButton(
                onPressed: _cancelSpecificSubscription,
                child: const Text('Cancel Specific Subscription With ID'),
              ),
              ElevatedButton(
                onPressed: _cancelSubscriptionWithoutId,
                child: const Text('Cancel Subscription'),
              ),
              ElevatedButton(
                onPressed: _cancelAllSubscriptions,
                child: const Text('Cancel All Subscriptions'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

更多关于Flutter事件总线插件easy_event_bus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter事件总线插件easy_event_bus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter中使用easy_event_bus事件总线插件的代码示例。easy_event_bus是一个轻量级的事件总线库,允许你在Flutter应用的不同组件之间传递消息和数据。

1. 添加依赖

首先,你需要在你的pubspec.yaml文件中添加easy_event_bus的依赖:

dependencies:
  flutter:
    sdk: flutter
  easy_event_bus: ^x.y.z  # 替换为最新版本号

然后运行flutter pub get来安装依赖。

2. 创建一个事件类

为了传递事件,你需要定义一个事件类。这个类可以是任何实现了Event接口的类,但通常你只需要创建一个普通的Dart类。

// event.dart
class MyEvent {
  final String message;

  MyEvent(this.message);
}

3. 初始化Event Bus

在你的应用中初始化Event Bus。通常你会在应用启动时(例如在main.dart中)初始化它。

import 'package:flutter/material.dart';
import 'package:easy_event_bus/easy_event_bus.dart';
import 'event.dart';

void main() {
  // 初始化EventBus
  EventBus.default.init();

  runApp(MyApp());
}

4. 监听事件

在你想监听事件的组件中,使用EventBus.default.on<EventType>方法来监听事件。

import 'package:flutter/material.dart';
import 'package:easy_event_bus/easy_event_bus.dart';
import 'event.dart';

class ListenerWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Listener Widget'),
      ),
      body: Center(
        child: Text('Listening for events...'),
      ),
    );
  }

  @override
  void initState() {
    super.initState();

    // 监听MyEvent事件
    EventBus.default.on<MyEvent>().listen((event) {
      print('Received event: ${event.message}');
      // 你可以在这里更新UI,使用setState()
    });
  }

  @override
  void dispose() {
    // 取消监听
    EventBus.default.off<MyEvent>();
    super.dispose();
  }
}

5. 发送事件

在你想发送事件的组件中,使用EventBus.default.emit方法来发送事件。

import 'package:flutter/material.dart';
import 'package:easy_event_bus/easy_event_bus.dart';
import 'event.dart';

class EmitterWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Emitter Widget'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 发送MyEvent事件
            EventBus.default.emit(MyEvent('Hello from EmitterWidget!'));
          },
          child: Text('Emit Event'),
        ),
      ),
    );
  }
}

6. 组合组件

最后,你可以在你的主应用中组合这些组件。

import 'package:flutter/material.dart';
import 'emitter_widget.dart';
import 'listener_widget.dart';

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Easy Event Bus Example',
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Easy Event Bus Example'),
        ),
        body: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            EmitterWidget(),
            SizedBox(height: 20),
            ListenerWidget(),
          ],
        ),
      ),
    );
  }
}

以上就是一个完整的Flutter应用示例,展示了如何使用easy_event_bus插件来在不同组件之间传递事件。你可以根据需要扩展和修改这个示例。

回到顶部