携手创作,共同生长!这是我参与「日新计划 8 月更文应战」的第5天,点击检查活动详情

前言

flutter项目中,有许多能够完成跨组件通讯的计划,其间包含InheritedWidget,Notification,EventBus等。本文主要探讨的是EventBus事情总线完成跨组件通讯的办法。

EventBus的简介

EventBus的中心是根据Streams。它允许侦听器订阅事情并允许发布者触发事情,使得不同组件的数据不需要一层层传递,能够直接经过EventBus完成跨组件通讯。

EventBus最主要是经过触发事情监听事情两项操作来完成不同页面的跨层拜访。触发事情是经过fire(event)办法进行,监听事情则是经过on<T>()办法进行的,其间泛型能够传入指定类型,事情总线将进行针对性监听,如果泛型传值为空,则默认监听一切类型的事情:

void fire(event) {
  streamController.add(event);
}
Stream<T> on<T>() {
  if (T == dynamic) {
    return streamController.stream as Stream<T>;
  } else {
    return streamController.stream.where((event) => event is T).cast<T>();
  }
}

EventBus的实际应用

1、在pubspec.yaml文件中引证eventBus事情总线依靠;

2、创立一个大局的EventBus实例;

3、运用fire(event)办法在事情总线上触发一个新事情(触发事情);

4、为事情总线注册一个监听器(监听事情);

5、撤销EventBus事情订阅,避免内存走漏。

// 1、在pubspec.yaml文件中引证eventBus事情总线依靠;
dependencies:
    event_bus: ^2.0.0
// 2、创立一个大局的EventBus实例;
EventBus myEventBus = EventBus();
// 3、运用fire(event)办法在事情总线上触发一个新事情(触发事情);
Center(
  child: ElevatedButton(
    onPressed: () {
      myEventBus.fire('经过EventBus触发事情');
    },
    child: Text('触发事情'),
  ),
)
var getData;
@override
void initState() {
  // TODO: implement initState
  super.initState();
  // 4、为事情总线注册一个监听器(监听事情);
  getData = myEventBus.on().listen((event) {
    print(event);
  });
}
@override
void dispose() {
  // TODO: implement dispose
  super.dispose();
  // 5、撤销EventBus事情订阅,避免内存走漏。
  getData.cancel();
}

总结

EventBus遵循的是发布/订阅模式,能够经过事情的触发和监听操作,有用完成跨组件通讯的功用。