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

相关推荐
崔庆才丨静觅1 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60612 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了2 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅2 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅2 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅3 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment3 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅3 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊3 小时前
jwt介绍
前端
爱敲代码的小鱼3 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax