日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Flutter?EventBus事件總線的應用詳解_Android

作者:Zheng ? 更新時間: 2022-10-26 編程語言

前言

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遵循的是發布/訂閱模式,能夠通過事件的觸發和監聽操作,有效實現跨組件通訊的功能。

原文鏈接:https://juejin.cn/post/7137327139061727262

欄目分類
最近更新