第七十八回:Flutter中的事件流

文章目录

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

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

概念介绍

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

使用方法

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

  • fromFutures方法:从Future数组中获取异步操作来组成事件流;事件的顺序按照数组的索引值依次进行;
  • listen方法:从事件流中获取事件的运行状态,比如运行错误,运行完成;

我们重点介绍listen方法,该方法以监听的方式运行,它提供了三个方法类型的参数来监听事件的运行状态,详细如下:

  • onData方法:每个事件运行完成后都会执行该方法,该方法是必选方法;
  • onError方法:如果事件流中的某个事件运行时发生了错误,那么回调该方法;
  • onDone方法:所有事件运行完成后回调该方法,表示事件流运行结束;

这三个方法中只有第一个方法是必选方法,最后两个方法是可选方法,不过我还是建议大家把这三个方法都用起来,特别是事件流中有错误发生可以获取到错误信息。

如果大家熟悉RxJava的话就地发现Stream的运行机制和RxJava的运行机制基本相同,不熟悉的话,也不用担心,这种机制就是典型的观察者模式:fromFuture方法对应的数组就是被观察者,或者说事件流就是被观察者,而listen方法就是观察者。

示例代码

_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中的事件流"相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!

你可能感兴趣的:(一起Talk,Flutter吧,flutter,事件流,stream,异步操作,future)