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