flutter开发实战-事件总线EventBus实现

这篇具有很好参考价值的文章主要介绍了flutter开发实战-事件总线EventBus实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

flutter开发实战-事件总线EventBus实现

在开发中,经常会需要一个广播机制,用以跨Widget事件通知。
事件总线 实现了订阅者模式,订阅者模式包含发布者和订阅者两种角色,可以通过事件总线来触发事件和监听事件。

一、自定义事件总线

实现eventBus

typedef AppEventCallback = void Function(dynamic arg);

// 事件总线
// 订阅者回调签名
class AppEventBus {
  //私有构造函数
  AppEventBus._internal();

  //保存单例
  static AppEventBus _singleton = AppEventBus._internal();

  //工厂构造函数
  factory AppEventBus() => _singleton;

  //保存事件订阅者队列,key:事件名(id),value: 对应事件的订阅者队列
  //Map<eventName, Map<hashCode, List[]>>
  final _emap = Map<Object, Map<String, List<AppEventCallback>?>>();

  // final _emap = Map<Object, List<GamePrizeEventCallback>?>();

  //添加订阅者
  void on(eventName, Object object, AppEventCallback f) {
    String hashCode = object.hashCode.toString();
    Map<String, List<AppEventCallback>?>? map = _emap[eventName];
    if (map == null) {
      map = Map<String, List<AppEventCallback>?>();
      _emap[eventName] = map;
    }

    map[hashCode] ??= <AppEventCallback>[];
    map[hashCode]!.add(f);
  }

  //移除订阅者
  void off(eventName, Object object, [AppEventCallback? f]) {
    String hashCode = object.hashCode.toString();
    Map<String, List<AppEventCallback>?>? map = _emap[eventName];
    if (map != null) {
      var list = map[hashCode];
      if (list == null) return;
      if (f == null) {
        map[hashCode] = null;
      } else {
        list.remove(f);
      }
    }
  }

  //触发事件,事件触发后该事件所有订阅者会被调用
  void emit(eventName, [arg]) {
    Map<String, List<AppEventCallback>?>? map = _emap[eventName];
    if (map != null) {
      for (String hashCode in map.keys) {
        List<AppEventCallback>? list = map[hashCode];
        if (list != null && list.isNotEmpty) {
          int len = list.length - 1;
          //反向遍历,防止订阅者在回调中移除自身带来的下标错位
          for (var i = len; i > -1; --i) {
            list[i](arg);
          }
        }
      }
    }
  }
}

二、使用event_bus库

在工程的pubspec.yaml引入库

  # enent_bus
  event_bus: ^2.0.0
  • 1.使用event_bus库

创建一个EventBus实例并使其可用于其他类。
通常每个应用程序只有一个事件总线,但可以设置多个事件总线来对特定的事件集进行分组。

import 'package:event_bus/event_bus.dart';

EventBus eventBus = EventBus();
  • 2.定义事件
class UserLoggedInEvent {
  User user;

  UserLoggedInEvent(this.user);
}

class NewOrderEvent {
  Order order;

  NewOrderEvent(this.order);
}
  • 3.注册监听者
// 特定事件监听
eventBus.on<UserLoggedInEvent>().listen((event) {
  // All events are of type UserLoggedInEvent (or subtypes of it).
  print(event.user);
});

// 所有事件监听
eventBus.on().listen((event) {
  // Print the runtime type. Such a set up could be used for logging.
  print(event.runtimeType);
});
  • 4.触发事件
User myUser = User('Mickey');
eventBus.fire(UserLoggedInEvent(myUser));

三、小结

flutter开发实战-事件总线EventBus实现,主要用于广播机制,跨Widget事件通知。

学习记录,每天不停进步。文章来源地址https://www.toymoban.com/news/detail-558085.html

到了这里,关于flutter开发实战-事件总线EventBus实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • flutter开发实战-实现左右来回移动的按钮引导动画效果

    flutter开发实战-实现左右来回移动的按钮引导动画效果 最近开发过程中需要实现左右来回移动的按钮引导动画效果 AnimationController用来控制一个或者多个动画的正向、反向、停止等相关动画操作。在默认情况下AnimationController是按照线性进行动画播放的。AnimationController两个监听

    2024年02月13日
    浏览(52)
  • JavaScript 发布-订阅设计模式实现 React EventBus(相当于vue的$Bus)非父子之间通信

    参考文档:https://github1s.com/browserify/events/blob/main/events.js                  https://www.npmjs.com/package/events                  https://github.com/browserify/events                     首先先新建一个文件eventBus.tsx 然后再组件A使用=接收 然后再组件B使用=触发     安装这个events插件

    2023年04月18日
    浏览(101)
  • Go语言EventBus

    EventBus是GoLang的小型轻量级事件总线,具有异步兼容性。 类似于观察者模式和发布订阅模式。 GitHub地址: https://github.com/asaskevich/EventBus 官方文档: https://pkg.go.dev/github.com/asaskevich/EventBus 1.1 安装 1.2 使用 进行封装: 订阅多个: Subscribe 可以放在 init 函数中: New() Subscribe() Su

    2024年02月11日
    浏览(33)
  • EventBus 开源库学习(二)

    EventBus在使用的时候基本分为以下几步: 1、注册订阅者 2、订阅者解注册,否者会导致内存泄漏 3、在订阅者中编写注解为Subscribe的事件处理函数 4、事件发送 我们先按使用的流程大体看下源码逻辑,源码版本3.3.1: 注册源码逻辑 EventBus 使用了双重校验锁的单例设计模式,保

    2024年02月14日
    浏览(37)
  • EventBus 开源库学习(三)

    上一节根据EventBus的使用流程把实现源码大体梳理了一遍,因为精力有限,所以看源码都是根据实现过程把基本流程看下,中间实现细节先忽略,否则越看越深不容易把握大体思路,这节把一些细节的部分再看看。 注解函数查找源码逻辑 在进行注册的时候,我们使用 subscri

    2024年02月14日
    浏览(32)
  • EventBus 开源库学习(一)

    一、概念 EventBus是一款在 Android 开发中使用的发布-订阅事件总线框架,基于观察者模式,将事件的接收者和发送者解耦,简化了组件之间的通信,使用简单、效率高、体积小。 一句话:用于Android组件间通信的。 二、原理 三、简单使用 在app module的builde.gradle文件中导入依赖

    2024年02月14日
    浏览(40)
  • EventBus详解 (详解 + 原理)

    EventBus简介 EventBus是一个开源库,由GreenRobot开发而来,是用于Android开发的 “事件发布 — 订阅总线”, 用来进行模块间通信、解藕。 它可以使用很少的代码,来实现多组件之间的通信。 Android系统内置的事件通讯存在缺点: Android系统中的事件通信则是 handler ( 消息机制 ) 和

    2024年02月02日
    浏览(39)
  • eventBus使用遇到的坑

    **问题:**通过eventBus传递的参数,在子组件的methods中无法通过this.使用。 **思路:**考虑组件方法的执行顺序(vue生命周期执行顺序) **解决办法:**在传递参数的组件外 this.$nextTick 创建eventBus.js文件 在需要传递消息的兄弟组件引入该js文件 传递消息 bus.$emit(“test”,param1,pa

    2024年02月14日
    浏览(45)
  • SpringBoot - Google EventBus、AsyncEventBus

    EventBus 顾名思义,事件总线,是一个轻量级的发布/订阅模式的应用模式,最初设计及应用源与 google guava 库。 相比于各种 MQ 中间件更加简洁、轻量,它可以在单体非分布式的小型应用模块内部使用(即同一个JVM范围)。 我们也可以把它和 MQ 中间件结合起来使用,使用 Even

    2024年02月10日
    浏览(32)
  • 选择 Guava EventBus 还是 Spring Framework ApplicationEvent

    文章首发地址 Spring Framework 的 ApplicationEvent 是 Spring 框架提供的一种事件机制,用于实现发布和订阅事件的功能。它基于观察者模式,允许应用程序内的组件之间进行松耦合的通信。 下面是关于 Spring Framework 的 ApplicationEvent 的详解: 事件定义: ApplicationEvent 是一个抽象类,用

    2024年02月09日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包