Flutter事件驱动Events ,来个广播通知/事件发射一下吧,又称下雨啦收衣服啦

安卓有什么Eventbus,Flutter也有。

举个例子吧,你有一个服务,服务有个下载功能,下载完成之后,调用这需要知道完成了,这个时候StreamController登场,发个广播/事件发生,调用者监听一下,okk。

事件驱动编程基础

老生常谈一下。

事件驱动编程依赖于两个主要概念:事件发射 (Emitting Events)和事件监听(Listening to Events)。事件发射是指当特定的动作或条件被满足时,系统会发送(或"发射")一个事件。事件监听则是指程序等待(或"监听")这些事件的发生,并在捕捉到事件时执行相应的响应。


使用Stream和StreamController

在Dart中,Stream提供了一种在时间上处理异步事件的方式。你可以把Stream想象成一个时间上的事件序列。StreamController则用于控制Stream:它可以向Stream添加事件,这些事件随后可以被监听并响应。

使用Stream和StreamController

在Dart中,Stream提供了一种在时间上处理异步事件的方式。你可以把Stream想象成一个时间上的事件序列。StreamController则用于控制Stream:它可以向Stream添加事件,这些事件随后可以被监听并响应。

Stream简介

在Dart中,Stream是一系列异步数据(事件)的序列。它是处理Dart中异步操作的核心抽象之一。使用Stream,你可以监听数据序列中的事件,并对每个事件作出响应。这些事件可以是任何东西,从用户在UI上的操作到来自网络请求的数据。

Stream有两种类型:

  • 单订阅Stream:只允许一个监听者。一旦有监听者开始监听,其他尝试监听此Stream的操作都会抛出异常。
  • 广播Stream:允许多个监听者同时监听事件。

StreamController简介

StreamController用于创建和管理Stream。它提供了向Stream添加事件的接口,并管理Stream的监听者。通过StreamController,你可以控制何时和如何将事件发送到监听者。

StreamController同样提供了单订阅和广播两种模式,通过使用.broadcast()构造函数创建广播模式的StreamController

实现步骤

  1. 创建StreamController

    首先,我们需要一个StreamController来管理事件流。通常,我们会选择.broadcast模式,这允许多个监听者监听事件。

    dart 复制代码
    final _eventController = StreamController<void>.broadcast();
  2. 发射事件

    当特定条件满足时,我们通过StreamControlleradd方法发射事件。例如,当用户点击按钮时,可能会发射一个事件。

    dart 复制代码
    _eventController.add(null); // 或者是其他有意义的数据
  3. 监听事件

    任何感兴趣的部分都可以监听这个Stream上的事件,并在事件发生时作出响应。

    dart 复制代码
    _eventController.stream.listen((event) {
      // 处理事件
    });
  4. 资源管理

    StreamController不再需要时,确保调用close方法来释放资源,避免内存泄漏。

    dart 复制代码
    _eventController.close();

示例应用

假设我们正在开发一个应用,需要在多个组件间共享用户认证状态的变化。我们可以创建一个认证服务,使用StreamController来管理认证状态变化的事件。

dart 复制代码
class AuthService {
  final _authStateController = StreamController<bool>.broadcast();

  Stream<bool> get onAuthStateChanged => _authStateController.stream;

  void login() {
    // 登录逻辑...
    _authStateController.add(true); // 发射登录成功事件
  }

  void logout() {
    // 登出逻辑...
    _authStateController.add(false); // 发射登出成功事件
  }

  void dispose() {
    _authStateController.close();
  }
}

这样,任何UI组件都可以监听onAuthStateChanged流,以便在用户登录或登出时更新界面。

总结

优势与场景

  • 数据绑定与更新 :在用户界面编程中,StreamStreamController非常适用于实现数据绑定和实时更新。例如,当应用的状态变化时,通过Stream自动更新UI。
  • 事件处理 :当处理用户输入、网络响应或其他异步事件时,Stream提供了一种优雅的方式来响应这些事件。
  • 资源管理StreamStreamController提供了细粒度的控制,帮助开发者管理资源使用,例如取消订阅和关闭Stream,避免资源泄漏。
  • 组合和转换 :Dart的StreamAPI提供了丰富的操作符(如mapwheredebounce等),允许你轻松地转换和组合数据流。

通过使用StreamStreamController,Flutter开发者可以以简洁、高效的方式实现跨组件的事件通知和监听。这种模式不仅提高了代码的可维护性,也使得组件间的通信更加灵活和解耦。

相关推荐
gnip6 小时前
企业级配置式表单组件封装
前端·javascript·vue.js
一只叫煤球的猫7 小时前
写代码很6,面试秒变菜鸟?不卖课,面试官视角走心探讨
前端·后端·面试
excel8 小时前
Three.js 材质(Material)详解 —— 区别、原理、场景与示例
前端
掘金安东尼8 小时前
抛弃自定义模态框:原生Dialog的实力
前端·javascript·github
hj5914_前端新手12 小时前
javascript基础- 函数中 this 指向、call、apply、bind
前端·javascript
薛定谔的算法12 小时前
低代码编辑器项目设计与实现:以JSON为核心的数据驱动架构
前端·react.js·前端框架
Hilaku12 小时前
都2025年了,我们还有必要为了兼容性,去写那么多polyfill吗?
前端·javascript·css
yangcode12 小时前
iOS 苹果内购 Storekit 2
前端
LuckySusu12 小时前
【js篇】JavaScript 原型修改 vs 重写:深入理解 constructor的指向问题
前端·javascript
LuckySusu12 小时前
【js篇】如何准确获取对象自身的属性?hasOwnProperty深度解析
前端·javascript