当前位置: 首页 > article >正文

使用Stream实现事件流

文章目录

  • 1 概念介绍
  • 2 使用方法
  • 3 示例代码

我们在上一章回中介绍了Flutter中的异步操作,本章回中将介绍Flutter中的事件流.闲话休提,让我们一起Talk Flutter吧。

在这里插入图片描述

1 概念介绍

我们在上一章回中介绍了异步操作相关的内容,本章回中将介绍如何把多个异步操作组成事件流。事件流是指让事件按照一定的顺序去执行,我们介绍RxJava时介绍这方
面的内容,感兴趣的看官可以去看看。Flutter提供了Stream类来实现事件流,本章回中将介绍它的使用方法。

2 使用方法

Stream类提供了一些静态方法来实现事件操作,常用的是静态方法如下:

  • fromFutures方法:从Future数组中获取异步操作来组成事件流;事件的顺序按照数组的索引值依次进行;
  • listen方法:从事件流中获取事件的运行状态,比如运行错误,运行完成;
    我们重点介绍listen方法,该方法以监听的方式运行,它提供了三个方法类型的参数来监听事件的运行状态,详细如下:
  • onData方法:每个事件运行完成后都会执行该方法,该方法是必选方法;
  • onError方法:如果事件流中的某个事件运行时发生了错误,那么回调该方法;
  • onDone方法:所有事件运行完成后回调该方法,表示事件流运行结束;
    这三个方法中只有第一个方法是必选方法,最后两个方法是可选方法,不过我还是建议大家把这三个方法都用起来,特别是事件流中有错误发生可以获取到错误信息。
    如果大家熟悉RxJava的话就地发现Stream的运行机制和RxJava的运行机制基本相同,不熟悉的话,也不用担心,这种机制就是典型的观察者模式:fromFuture方法
    对应的数组就是被观察者,或者说事件流就是被观察者,而listen方法就是观察者。

3 示例代码

_syncMultiLauncher() {
  Stream.fromFutures([
    Future.delayed(Duration(seconds: 2),()=>debugPrint('do one'),),
    // Future.delayed(Duration(seconds: 2),()=>debugPrint('do two'),),
    Future.delayed(Duration(seconds: 2),(){throw AssertionError();},),
    Future.delayed(Duration(seconds: 2),()=>debugPrint('do three'),),
  ])
  .listen(
    (event) {print('onData');},
    onDone:() => print('onDone'),
    onError: (v) => print('onError'),
  );
}

在上面的代码中,使用三个Future异步事件组成了事件流,它的执行顺序按照它们在数组中的索引依次进行,编译并且运行上面的程序可以得到以下运行结果:
I/flutter ( 7402): do one
I/flutter ( 7402): onData
I/flutter ( 7402): onError
I/flutter ( 7402): do three
I/flutter ( 7402): onData
I/flutter ( 7402): onDone
从程序运行结果中可以看到先运行事件流中的第一个事件:do one,listen()方法监听到该事件后运行onData方法;接着运行事件流中的第二个事件,该事件主动抛出
一个错误,listen()方法监听到错误后运行onError方法,注意它不会去运行onData方法;最后运行第三个事件:do three,listen()方法监听到该事件后运行
onData方法,到目前为止,事件流中的三个事件都已经运行结束,此时listen()方法调用onDone方法,表示事件流中的所有事件运行完成。
看官们,关于"Flutter中的事件流"相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!


http://www.kler.cn/a/315892.html

相关文章:

  • 【数学二】线性代数-二次型
  • 解读Nature:Larger and more instructable language models become less reliable
  • 使用CNN进行验证码识别:深度学习与图像预处理教程
  • 如何向函数模块 FM 中传递 Range 参数
  • Spring Cloud Gateway(分发请求)
  • 【CVPR2024】2024年CVPR的3D 目标检测的综述(还在补充中)
  • Django一分钟:借助Django的认证系统快速实现RBAC权限校验以及Session会话
  • 深入浅出:Eclipse 中配置 Maven 与 Spark 应用开发全指南
  • 一个能同时to B和to C、批发零售一体化的需求分析和系统设计
  • 达梦数据库对象管理(三):索引
  • 使用vue创建项目
  • 蓝桥杯模块一:LED指示灯的基本控制
  • JavaEE: 深入探索TCP网络编程的奇妙世界(四)
  • 视频工具EasyDarwin将本地视频生成RTSP给WVP拉流列表
  • 基于51单片机的手环设计仿真
  • LeetCode 热题 100 回顾8
  • 【STM32】TIM定时器定时中断与定时器外部时钟的使用
  • ICM20948 DMP代码详解(38)
  • go libreoffice word 转pdf
  • 耦合微带线单元的网络参量和等效电路公式推导
  • C++在线开发服务器环境搭建
  • 记一次docker打包部署历程
  • openeuler 22.03 lts sp4 使用 kubeadm 部署 k8s-v1.28.2 高可用集群
  • Linux下实现ls命令的功能
  • 【C++】—— stack queue deque
  • 数据库三范式和ER图详解