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

1 回复

更多关于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. 监听事件

你可以在需要的地方监听事件。通常,你会在 StatefulWidgetinitState 方法中监听事件,并在 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);
  }
}
回到顶部