Flutter中EventBus组件的使用

1.首先导入使用EventBus时所需的包:event_bus: ^1.1.1

2.还需要一个EventBus工具类:

import 'dart:async';

import 'package:event_bus/event_bus.dart';
import 'package:flutter/widgets.dart';

/// EventBus的工具类
class HosEventBusUtils {
  // 单列模式
  static EventBus _eventBus;

  static EventBus shared() {
    if (_eventBus == null) {
      _eventBus = EventBus(); // 创建事件总线
    }
    return _eventBus;
  }

  /// 订阅者
  static Map> subscriptions = {};

  /// 添加监听事件
  /// [T] 事件泛型 必须要传
  /// [onData] 接受到事件
  /// [autoManaged] 自动管理实例,off 取消
  static StreamSubscription on(void onData(T event),
      {Function onError,
      void onDone(),
      bool cancelOnError,
      bool autoManaged = true}) {
    StreamSubscription subscription = shared()?.on()?.listen(onData,
        onError: onError, onDone: onDone, cancelOnError: cancelOnError);
    if (autoManaged == true) {
      if (subscriptions == null) subscriptions = {};
      List subs = subscriptions[T.runtimeType] ?? [];
      subs.add(subscription);
      subscriptions[T.runtimeType] = subs;
    }
    return subscription;
  }

  /// 移除监听者
  /// [T] 事件泛型 必须要传
  /// [subscription] 指定
  static void off({StreamSubscription subscription}) {
    if (subscriptions == null) subscriptions = {};
    if (subscription != null) {
      // 移除传入的
      List subs = subscriptions[T.runtimeType] ?? [];
      subs.remove(subscription);
      subscriptions[T.runtimeType] = subs;
    } else {
      // 移除全部
      subscriptions[T.runtimeType] = null;
    }
  }

  /// 发送事件
  static void fire(event) {
    shared()?.fire(event);
  }
}

/// EventBus的工具类
/// 有状态组件
mixin HosEventBusMixin on State {
  /// 需要定义成全局的,共用一个是实例
  EventBus mEventBus = HosEventBusUtils.shared();

  /// 订阅者
  List mEventBusSubscriptions = [];

  /// 统一在这里添加监听者
  @protected
  void mAddEventBusListeners();

  /// 添加监听事件
  void mAddEventBusListener(void onData(T event),
      {Function onError, void onDone(), bool cancelOnError}) {
    mEventBusSubscriptions?.add(mEventBus?.on()?.listen(onData,
        onError: onError, onDone: onDone, cancelOnError: cancelOnError));
  }

  /// 发送事件
  void mEventBusFire(event) {
    mEventBus?.fire(event);
  }

  @override
  @mustCallSuper
  void dispose() {
    super.dispose();
    debugPrint('dispose:HosEventBusMixin');
    if (mEventBusSubscriptions != null)
      for (StreamSubscription subscription in mEventBusSubscriptions) {
        subscription.cancel();
      }
  }

  @override
  @mustCallSuper
  void initState() {
    super.initState();
    debugPrint('initState:HosEventBusMixin');
    mAddEventBusListeners();
  }
}

3.写一个事件类,如下:(这个类可以携带你需要发送的数据)可以把他理解为一个搬运工

class ReFreshXXXEvent {
  String text;

  ReFreshFamilyMemberEvent(this.text);
}

4.然后开始发送事件,使用工具类里的 fire() 方法,发送你刚刚创建的事件类,传入需要传送的数据:

HosEventBusUtils.fire(ReFreshXXXEvent("发送事件啦"));

5.最后就要使用on()方法来接收事件了,我一般是用来返回上个页面时刷新数据的:

/// 我一般把这个放到 initState() 方法里
HosEventBusUtils.on(
    (event) {
        if (event != null) {
            // 这里需要好好理解 mounted
            if (mounted)
                setState(() {
                    // 获取传过来的数据
                    // print("eventbus传过来的数据:" + event.text);
                    // 在这里执行相关的刷新操作,如刷新列表
                });
        }
    },
);

6.基本的使用就这样了

你可能感兴趣的:(Flutter)