Flutter事件管理插件event_truck的使用

Flutter事件管理插件EventTruck的使用

EventTruck 是一个轻量级、可扩展且类型安全的事件总线系统,用于在 Dart/Flutter 应用程序中管理事件驱动架构。它提供了一个精简的 API 来广播和监听事件,并提供了可选的支持事件观察、调试和日志记录。

特性

  • 广播事件:高效地向多个监听器发送事件。
  • 可选的事件观察:使用自定义观察器跟踪和调试发出的事件。
  • 类型安全的事件处理:通过类型过滤事件并确保事件处理的安全性。
  • 作用域生命周期管理:通过正确处置事件总线来清理资源。

开始使用

安装

EventTruck 添加到您的 Dart 或 Flutter 项目中,在 pubspec.yaml 文件中包含以下内容:

dependencies:
  event_truck: <最新版本>

然后运行:

flutter pub get

使用方法

设置 EventTruck

创建一个 EventTruck 实例来处理事件:

final eventTruck = EventTruck();

监听事件

使用 on<T>() 方法订阅特定类型的事件:

// 封装类
sealed class Event {}

class ClickEvent extends Event {
  final String buttonId;
  ClickEvent(this.buttonId);
}

class TextEvent extends Event {
  final String text;
  TextEvent(this.text);
}

// 监听所有类型为 `Event` 的事件(基类或子类)
eventTruck.on<Event>((event) => switch(event) {
  ClickEvent() => print(event.buttonId),
  TextEvent() => print(event.text),
});

// 或者分别监听不同类型
eventTruck.on<ClickEvent>((event) => print(event.buttonId));
eventTruck.on<TextEvent>((event) => print(event.text));

发送事件

使用 add() 方法发送事件:

eventTruck.add(ClickEvent('submit_button'));
eventTruck.add(TextEvent('Hello World!'));

使用观察器

为了监控所有事件以进行日志记录或调试,实现 EventTrackObserver 接口:

class DebugObserver implements EventTrackObserver {
  [@override](/user/override)
  void onEvent<T>(T event) {
    print('Observed event: $event');
  }
}

void main() {
  EventTruck.observer = DebugObserver();
  final eventTruck = EventTruck();
  eventTruck.add('Tracking this event');
}

清理资源

当不再需要 EventTruck 实例时,调用 dispose() 方法清理资源:

eventTruck.dispose();

API 参考

EventTruck

on<T>()

订阅特定类型的事件。

参数

  • callback:处理特定事件类型的函数。

返回值:按类型 T 过滤的事件流控制器。

示例

StreamController<ClickEvent> _streamController = eventTruck.on<ClickEvent>((event) {
  print('Received click event: $event');
});

_streamController.close();
add(Event event)

向所有监听器添加新的事件。

参数

  • event:要添加到事件流的事件。

示例

eventTruck.add('New message event');
dispose()

通过关闭底层 StreamController 清理资源。

示例

eventTruck.dispose();

EventTrackObserver

用于跟踪发出的事件的接口。

onEvent<T>(event)

处理并记录发出的事件。

参数

  • event:通过 EventTruck 发出的事件。

示例

class MyObserver implements EventTrackObserver {
  [@override](/user/override)
  void onEvent<T>(T event) {
    print('Logged event: $event');
  }
}

最佳实践

  1. 处置:始终调用 dispose() 以避免内存泄漏。
  2. 观察器使用:开发时使用观察器进行调试,但在生产环境中避免过度日志记录。
  3. 类型安全的事件:利用泛型 API 在处理事件时保持类型安全。
  4. 最小化作用域:为应用程序的不同部分使用独立的 EventTruck 实例,以减少不必要的事件传播。

示例项目

以下是一个简单的示例,演示如何使用 EventTruck

void main() {
  final eventTruck = EventTruck();

  // 监听字符串事件
  eventTruck.on<String>((event) {
    print('String Event: $event');
  });

  // 发送不同类型的事件
  eventTruck.add('Hello, EventTruck!');
  eventTruck.add(123);

  // 使用观察器
  EventTruck.observer = DebugObserver();

  // 清理资源
  eventTruck.dispose();
}

class DebugObserver implements EventTrackObserver {
  [@override](/user/override)
  void onEvent<T>(T event) {
    print('Debug Observer: $event');
  }
}

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

1 回复

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


当然,event_truck 是一个用于 Flutter 的事件管理插件,它允许开发者在应用的不同部分之间传递事件。下面是一个如何使用 event_truck 的代码示例,以帮助你理解其基本用法。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  event_truck: ^最新版本号  # 请替换为实际的最新版本号

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

2. 初始化 EventTruck

在你的应用的入口文件(通常是 main.dart)中初始化 EventTruck

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

void main() {
  // 初始化 EventTruck
  EventTruck.initialize();

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}

3. 定义事件和数据模型

定义一个事件类,通常这个类会继承自 Event

import 'package:event_truck/event_truck.dart';

class MyCustomEvent extends Event {
  final String message;

  MyCustomEvent({required this.message});
}

4. 触发事件

在你希望触发事件的组件或逻辑中调用 EventTruck.fire 方法:

import 'package:flutter/material.dart';
import 'my_custom_event.dart';  // 假设你的事件类定义在这个文件中

class TriggerScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Trigger Screen'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 触发事件
            EventTruck.fire(MyCustomEvent(message: 'Hello from TriggerScreen!'));
            Navigator.push(
              context,
              MaterialPageRoute(builder: (context) => ListenerScreen()),
            );
          },
          child: Text('Trigger Event'),
        ),
      ),
    );
  }
}

5. 监听事件

在希望监听事件的组件中,使用 EventTruck.listen 方法:

import 'package:flutter/material.dart';
import 'my_custom_event.dart';  // 假设你的事件类定义在这个文件中

class ListenerScreen extends StatefulWidget {
  @override
  _ListenerScreenState createState() => _ListenerScreenState();
}

class _ListenerScreenState extends State<ListenerScreen> {
  @override
  void initState() {
    super.initState();

    // 监听事件
    EventTruck.listen<MyCustomEvent>().listen((event) {
      // 处理事件
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(
          content: Text(event.message),
        ),
      );
    });
  }

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

6. 完整示例

将以上各部分整合起来,你会得到一个完整的 Flutter 应用示例:

// main.dart
import 'package:flutter/material.dart';
import 'package:event_truck/event_truck.dart';
import 'my_custom_event.dart';
import 'trigger_screen.dart';

void main() {
  EventTruck.initialize();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: TriggerScreen(),
    );
  }
}

// my_custom_event.dart
import 'package:event_truck/event_truck.dart';

class MyCustomEvent extends Event {
  final String message;

  MyCustomEvent({required this.message});
}

// trigger_screen.dart
import 'package:flutter/material.dart';
import 'listener_screen.dart';
import 'my_custom_event.dart';

class TriggerScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Trigger Screen'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            EventTruck.fire(MyCustomEvent(message: 'Hello from TriggerScreen!'));
            Navigator.push(
              context,
              MaterialPageRoute(builder: (context) => ListenerScreen()),
            );
          },
          child: Text('Trigger Event'),
        ),
      ),
    );
  }
}

// listener_screen.dart
import 'package:flutter/material.dart';
import 'my_custom_event.dart';

class ListenerScreen extends StatefulWidget {
  @override
  _ListenerScreenState createState() => _ListenerScreenState();
}

class _ListenerScreenState extends State<ListenerScreen> {
  @override
  void initState() {
    super.initState();

    EventTruck.listen<MyCustomEvent>().listen((event) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(
          content: Text(event.message),
        ),
      );
    });
  }

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

以上代码展示了如何在 Flutter 应用中使用 event_truck 插件进行事件管理。你可以根据具体需求扩展和修改这些示例。

回到顶部