Flutter事件总线插件typed_bus的使用

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

Flutter事件总线插件typed_bus的使用

TypedBus (tB)

TypedBus (tB) 和 TypedBusEvents (tBE) 为 Dart 应用程序提供了一个强大的、类型安全的事件总线。通过 TypedBus,您可以发布和订阅强类型的事件,确保应用程序不同部分之间的通信安全。

此库提供了编译时和运行时的安全性,允许开发者编写干净且可预测的事件驱动代码。


特性

  • 🎯 类型安全的事件处理:事件与特定的数据类型关联,确保仅传递有效的负载。
  • 动态事件注册:使用 tBE 动态注册新事件及其类型。
  • 🔔 订阅管理:订阅事件并监听类型化的数据。
  • 📤 发布事件:全局发布强类型的事件。
  • 🛡️ 错误处理:在发布和订阅期间保护类型不匹配的情况。

安装

将包添加到您的 pubspec.yaml 文件中:

dependencies:
  typed_bus: ^1.0.0

然后获取包:

flutter pub get

入门指南

1. 注册事件

在发布或订阅之前,使用 tBE.registerEvent 注册事件及其预期的负载类型:

tBE.registerEvent<String>('event1');

2. 订阅事件

使用 tB.subscribe 来监听特定事件。订阅者接收的负载类型与注册类型一致:

tB.subscribe<String>('event1').listen((String data) {
  print('Received Event 1: $data');
});

3. 发布事件

使用 tB.publish 发送全局事件及其对应的负载:

tB.publish<String>('event1', "Hello world!");

4. 错误处理

如果您尝试发布或订阅不匹配的类型,库将在运行时抛出异常。特别注意泛型如 Map 的类型一致性。

类型不匹配的示例

tB.publish<String>('action3', SomethingCrazy(
  options: {},
  option1: true,
  option2: false,
  option3: true,
  option4: false,
));
// 抛出异常:类型不匹配

API 参考

TypedBusEvents (TBE)

注册一个事件

tBE.registerEvent<T>(String event);
  • 注册一个新的事件,指定负载类型 <T>

示例

tBE.registerEvent&lt;String&gt;('my_event');

TypedBus (TB)

订阅一个事件

Stream&lt;T&gt; tB.subscribe&lt;T&gt;(String event);
  • 订阅一个事件并监听类型为 <T> 的负载。

发布一个事件

void tB.publish&lt;T&gt;(String event, T data);
  • 发布一个全局事件,带有给定的负载。

示例用法

import 'package:typed_bus/typed_bus.dart';

void main() {
  // 注册事件
  tBE.registerEvent&lt;String&gt;('eventName');

  // 订阅事件
  tB.subscribe&lt;String&gt;('eventName').listen((data) {
    print('Received eventName: $data');
  });

  // 发布事件
  tB.publish&lt;String&gt;('eventName', 'Hello world!');
}

高级用法

自定义类型

对于具有自定义类型的事件,直接使用即可。

定义自定义类型

class TodoItem {
  String description;
  bool isDone;

  TodoItem({required this.description, required this.isDone});

  @override
  String toString() {
    return 'TodoItem(description: $description, isDone: $isDone)';
  }
}

使用自定义类型

tBE.registerEvent&lt;TodoItem&gt;("toggle");

tB.subscribe&lt;TodoItem&gt;('toggle').listen((TodoItem item) {
  // 对项目进行操作
  toggleItem(item);
});

tB.publish&lt;TodoItem&gt;(
    'toggle', TodoItem(description: "Publish Toggle Event", isDone: false));

动态负载

对于负载类型不固定的事件,可以使用 dynamic

tBE.registerEvent&lt;dynamic&gt;('dynamic_event');

tB.subscribe&lt;dynamic&gt;('dynamic_event').listen((data) {
  print('动态事件接收到: $data');
});

tB.publish&lt;dynamic&gt;('dynamic_event', {'key': 'value'});
tB.publish&lt;dynamic&gt;('dynamic_event', 12345);

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

1 回复

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


当然,以下是如何在Flutter项目中使用typed_bus事件总线插件的一个代码示例。typed_bus是一个用于Flutter的事件总线库,它允许你在应用程序的不同部分之间发送和接收事件,同时保持类型安全。

1. 添加依赖

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

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

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

2. 定义事件类型

接下来,你需要定义你想要传递的事件类型。例如,我们可以定义一个简单的CounterEvent

// counter_event.dart
class CounterEvent {
  final int count;

  CounterEvent({required this.count});
}

3. 创建事件总线

然后,你需要创建一个事件总线实例。通常,你会在一个全局可访问的地方创建这个实例,比如一个单例类:

// event_bus.dart
import 'package:typed_bus/typed_bus.dart';
import 'counter_event.dart';

class EventBus {
  static final EventBus _instance = EventBus._internal();
  final TypedBus<CounterEvent> _bus = TypedBus<CounterEvent>();

  factory EventBus() => _instance;

  EventBus._internal();

  void fire(CounterEvent event) {
    _bus.fire(event);
  }

  Stream<CounterEvent> listen() {
    return _bus.listen();
  }
}

4. 触发事件

在你的应用程序中的某个地方,你可以触发一个事件。例如,在一个按钮点击事件中:

// main.dart (部分代码)
import 'package:flutter/material.dart';
import 'event_bus.dart';
import 'counter_event.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Flutter Typed Bus Example')),
        body: Center(
          child: MyButton(),
        ),
      ),
    );
  }
}

class MyButton extends StatelessWidget {
  final EventBus _eventBus = EventBus();

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: () {
        _eventBus.fire(CounterEvent(count: 42));
      },
      child: Text('Fire Event'),
    );
  }
}

5. 监听事件

最后,在你想监听事件的组件中,你可以订阅事件流:

// counter_listener.dart
import 'package:flutter/material.dart';
import 'event_bus.dart';
import 'counter_event.dart';

class CounterListener extends StatefulWidget {
  @override
  _CounterListenerState createState() => _CounterListenerState();
}

class _CounterListenerState extends State<CounterListener> {
  String _message = 'No event received';

  @override
  void initState() {
    super.initState();
    final EventBus _eventBus = EventBus();
    _eventBus.listen().listen((event) {
      setState(() {
        _message = 'Received event with count: ${event.count}';
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Text(_message),
    );
  }
}

6. 整合组件

现在,你可以将监听器组件添加到你的主应用程序中:

// main.dart (完整代码)
import 'package:flutter/material.dart';
import 'event_bus.dart';
import 'counter_event.dart';
import 'counter_listener.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Flutter Typed Bus Example')),
        body: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Center(
              child: MyButton(),
            ),
            SizedBox(height: 20),
            CounterListener(),
          ],
        ),
      ),
    );
  }
}

class MyButton extends StatelessWidget {
  final EventBus _eventBus = EventBus();

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: () {
        _eventBus.fire(CounterEvent(count: 42));
      },
      child: Text('Fire Event'),
    );
  }
}

这个示例展示了如何在Flutter中使用typed_bus插件来创建、触发和监听事件。通过这种方式,你可以轻松地在应用的不同部分之间传递数据,同时保持类型安全和代码的清晰。

回到顶部