flutter event_bus使用介绍


flutter中可以是用event_bus来消息通知
event_bus使用的是event_bus https://pub.dev/packages/event_bus 这个库,这里只介绍如果使用该plugin,以及在使用的时候遇到的一些问题
本例demo下载地址:https://github.com/qqcc1388/flutter_event_bus
官方给出的使用方法:

创建消息对象
class UserLoggedInEvent {
  User user;

  UserLoggedInEvent(this.user);
}

创建eventBus
EventBus eventBus = EventBus();

注册订阅 这里可以将保存下来 dispose可以将该stream移除订阅
StreamSubscription loginSubscription = eventBus.on().listen((event) {
  // All events are of type UserLoggedInEvent (or subtypes of it).
  print(event.user);
});


eventBus.on().listen((event) {
  // All events are of type UserLoggedInEvent (or subtypes of it).
  print(event.user);
});

发送消息
User user = {}; 
eventBus.fire(UserLoggedInEvent(user));

移除eventBus
  @override
  void dispose() {
    loginSubscription.cancel();
    super.dispose();
  }

主要注意的是 添加过订阅后 一定要将订阅steam移除,否则,页面计算被移除,仍然可以接收到订阅消息,造成内存泄漏

基于官方给的使用方法,对eventbus做了一层封装,方便在项目中使用

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

typedef void EventCallback(T event);

class EventBusUtils {
  factory EventBusUtils() => _getInstance();
  static EventBusUtils get instance => _getInstance();
  static EventBusUtils _instance;
  EventBusUtils._internal() {
    // 初始化
    _eventBus = new EventBus();
  }

  //初始化eventBus
  EventBus _eventBus;
  // EventBus get eventBus => _eventBus;

  /// 订阅stream列表
  // List subscriptionList;

  static EventBusUtils _getInstance() {
    if (_instance == null) {
      _instance = new EventBusUtils._internal();
    }
    return _instance;
  }

  /// 开启eventbus订阅 并
  StreamSubscription on(EventCallback callback) {
    StreamSubscription stream = _eventBus.on().listen((event) {
      callback(event);
    });
    // subscriptionList.add(stream);
    return stream;
  }

  /// 发送消息
  void emit(event) {
    _eventBus.fire(event);
    
  }

  /// 移除steam
  void off(StreamSubscription steam) {
    steam.cancel();
  }
}

var eventBus = EventBusUtils.instance;

使用起来很很简单

 var loginSuccessEvent;
  添加订阅
  loginSuccessEvent = eventBus.on((event) {
    print('page A received msg');
    setState(() {
      params = event.userInfo;
    });
  });

 发送消息订阅
 User user = {};
 eventBus.emit(UserLoggedInEvent(user));

  取消订阅
   @override
  void dispose() {
    eventBus.off(loginSuccessEvent);
    super.dispose();
  }

封装之后,使用变的简化了

需要注意一点的是在使用event_bus的时候不要调用destroy()方法,否则将无法收到消息监听,如果要移除订阅,请使用 stream.cancel();