Flutter事件订阅插件eventsubscriber的使用

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

EventSubscriber

EventSubscriber 是一个 Flutter 小部件,每当有新的事件发生时,它会重建。这个小部件会在一个或多个事件发生时被通知并重建,从而允许显示在 Flutter 用户界面中观察对象的某些变化。

注意:运行包含的示例项目以查看工作示例。

内容

使用方法

Flutter 的 EventSubscriber 小部件需要您指定一个或多个事件,以及一个返回子小部件的 builder 函数。

// 示例
EventSubscriber(
  events: [myCount.valueChanged],  // 一个或多个事件的列表
  builder: (context, status, args) => Text('${myCount.value}'), // 返回一个文本小部件,显示当前计数值
),

参见

Event - 一个 Dart 包,向感兴趣的订阅者广播事件。

依赖项

  • Flutter - 此包依赖于 Flutter 框架。
  • Event - 支持创建轻量级自定义 Dart 事件,允许感兴趣的订阅者被告知发生了某事。提供跨独立包/层/模块的通知机制,仅依赖于 Dart。

示例

请参阅示例文件夹以获取更详细的示例。

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

// 一个简单的计数器示例域模型
// 通常位于其自己的模块/包中
// 这里为了说明目的内联包含
class Counter {
  int value = 0;
  var valueChanged = Event(); // 声明事件

  void increment() {
    value++;
    // 广播值已更改
    valueChanged.broadcast();
  }
}

//////////////////////

// 创建域模型
var myCounter = Counter();

// Flutter 应用程序
// 当按钮被按下时,计数器值将增加。
// 更新后的值将自动更新到用户界面上。
void main() => runApp(
      MaterialApp(
        home: Column(
          children: <Widget>[
            // 订阅 'valueChanged' 域事件
            EventSubscriber(
              events: [myCounter.valueChanged],
              builder: (context, status, args) {
                return Text(myCounter.value.toString()); // 显示当前计数值
              },
            ),
            FlatButton(
              child: Text('Increment'),
              // 增加域值
              onPressed: () => myCounter.increment(),
            )
          ],
        ),
      ),
    );

请求功能和报告错误

请在 issue tracker 上输入功能请求和报告错误。


以下是完整的示例代码,包括诊断日志记录:

import 'dart:io';

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

// Create the domain model
var myCounter = Counter();

// ==========================================

// Flutter application
// The myCounter.value will increment when the button is pressed.
// The changed domain value will be automatically updated in the UI.

void main() {
  // Optional diagnostic logging
  showLog(stdout, Severity.all);
  log("Starting example Counter app"); // an example log message

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.purple,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text("EventSubscriber Example"),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              //=================================
              // Subscribe to the 'valueChangedEvent' domain event
              // The handler will be run whenever the Event occurs (is broadcast)
              EventSubscriber(
                events: [myCounter.valueChangedEvent], // 可以订阅多个事件
                builder: (context, status, args) {
                  // status 是 3.0 新增的
                  return Column(
                    children: [
                      Text('Counter: ${myCounter.value}', style: TextStyle(fontSize: 24)), // 显示当前计数值

                      // 如果还没有接收到任何事件,则做些不同的处理
                      if (status.hasReceivedFirstEvent)
                        Column(
                          children: [
                            SizedBox(height: 24),
                            //
                            Text('Received Event'),
                            Text('When: ${args.whenOccurred}'),
                            Text('Event count: ${status.numEventsReceived}'),
                            Text('Event name: ${args.eventName}'),
                            //
                            SizedBox(height: 24),
                            Text('Note: See the Flutter DevTools Logging pane'),
                            Text('for diagnostic Event related messages.'),
                          ],
                        )
                      else
                        Text('No event received yet'),
                    ],
                  );
                },
              ),

              //=================================
            ],
          ),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: myCounter.increment, // 点击按钮时增加计数
          tooltip: 'Increment',
          child: const Icon(Icons.add),
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用event_subscriber插件进行事件订阅的示例代码。event_subscriber是一个假定的插件名称,因为在实际Flutter生态系统中,具体的事件订阅机制可能通过不同的库(如providerblocrxdart等)来实现。不过,为了回答你的问题,我将假设event_subscriber是一个简单的事件总线库,并展示一个基本的使用案例。

首先,你需要在pubspec.yaml文件中添加event_subscriber依赖(请注意,这只是一个假设的依赖名,你需要替换为实际存在的库):

dependencies:
  flutter:
    sdk: flutter
  event_subscriber: ^x.y.z  # 替换为实际版本号

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

接下来,我们创建一个事件类和一个事件发布者/订阅者系统。由于event_subscriber是假设的,我们将创建一个简单的实现来模拟其功能。

1. 定义一个事件类

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

  CustomEvent(this.message);
}

2. 创建一个事件总线(Event Bus)

// event_bus.dart
import 'dart:async';
import 'event.dart';

class EventBus {
  private static final EventBus _instance = new EventBus._internal();

  factory EventBus() {
    return _instance;
  }

  EventBus._internal();

  final _subscribers = new HashMap<Type, List<Function>>();

  void subscribe<T>(Function handler) {
    _subscribers.putIfAbsent(T, () => []).add(handler as Function);
  }

  void unsubscribe<T>(Function handler) {
    _subscribers[T]?.remove(handler as Function);
  }

  void publish(event) {
    if (_subscribers.containsKey(event.runtimeType)) {
      _subscribers[event.runtimeType]?.forEach((handler) => handler(event));
    }
  }
}

final eventBus = EventBus();

3. 在Flutter组件中使用事件总线

// main.dart
import 'package:flutter/material.dart';
import 'event.dart';
import 'event_bus.dart';

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

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

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String _eventMessage = "";

  @override
  void initState() {
    super.initState();
    // 订阅事件
    eventBus.subscribe<CustomEvent>((event) {
      setState(() {
        _eventMessage = event.message;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Event Subscriber Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Event Message: $_eventMessage',
              style: TextStyle(fontSize: 20),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                // 发布事件
                eventBus.publish(CustomEvent("Hello, Flutter!"));
              },
              child: Text('Publish Event'),
            ),
          ],
        ),
      ),
    );
  }

  @override
  void dispose() {
    // 取消订阅(可选,但推荐在组件销毁时取消订阅)
    eventBus.unsubscribe<CustomEvent>((event) {
      setState(() {
        _eventMessage = event.message;
      });
    });
    super.dispose();
  }
}

在这个示例中,我们创建了一个简单的事件总线系统,允许组件订阅和发布自定义事件。CustomEvent类代表了一个事件,而EventBus类则管理事件的订阅和发布。在MyHomePage组件中,我们订阅了CustomEvent并在接收到事件时更新UI。同时,我们还提供了一个按钮来发布事件。

请注意,这只是一个基本的示例,用于展示如何在Flutter中实现事件订阅机制。在实际项目中,你可能需要使用更复杂的状态管理解决方案,如providerblocrxdart等。

回到顶部