我们在上一章回中介绍了事件流相关的内容,本章回中将介绍 如何管理Stream事件流。闲话休提,言归正传,让我们一起Talk Flutter吧。
概念介绍
我们简单回顾一下前面的知识:Stream
把相关的事件组成了事件流,并且提供方法来监听这些事件的运行情况,事件的运行由事件自身决定而且不受Stream
控制,不过Stream
可以控制监听操作。我们在本章回中介绍的管理主要是指对监听操作的管理,比如暂停和恢复。从代码角度看就是对listen
()方法的功能进行管理。
管理方法
Stream
的listen
()方法运行时会返回StreamSubscription
类型的对象,该类型提供了相关的方法来控制监听操作,下面是该类提供的方法:
- pause()方法:监听操作自动运行,通过该方法可以暂停监听操作;
- resum()方法:该方法可以恢复被暂停的监听操作;
- cancel()方法:该方法可以取消监听操作;
示例代码
介绍完原理和管理监听操作的方法后,通过具体的代码来演示:
//用来存放stream listen方法返回的结果
late StreamSubscription<String> _streamSubscription;
//使用方法抽象出三个事件
Future<String> _eventOne() async{
await Future.delayed(Duration(seconds: 2),()=>debugPrint('do one'),);
return 'Event One';
}
Future<String> _eventTwo() async{
await Future.delayed(Duration(seconds: 2),()=>debugPrint('do two'),);
throw "Event exception";
}
Future<String> _eventThree() async{
await Future.delayed(Duration(seconds: 2),()=>debugPrint('do three'),);
return 'Event Three';
}
//带有数据的事件流,数据类型为string
_eventStream = Stream.fromFutures([
_eventOne(),
_eventTwo(),
_eventThree(),
]);
//封装三个方法,它们用在stream的listen方法中
_onData(data) => debugPrint("onData: $data");
_onError(error) => debugPrint("onError: $error");
_onDone() => debugPrint("onDone:");
void _startStream() {
_streamSubscription = _eventStream.listen(_onData,onError:_onError ,onDone:_onDone);
}
void _resumeStream() {
_streamSubscription.resume();
}
void _pauseStream() {
_streamSubscription.pause();
}
void _cancelStream() {
_streamSubscription.cancel();
}
上面的代码中的Stream
事件流包含三个事件,有两个事件返回String类型的数据,一个事件抛出异常。这三个事件都是通过Future
构建的,事件的返回类型与Future
中泛型的类型相同,都是String类型。
从监听操作对应的onData
()方法中可以获取到事件返回的数据,我们把数据打印到终端,这样方便观看数据的值。
我们把监听操作以及对监听操作的控制(管理)方法封装成了单独的方法,然后把这些方法赋值给按钮的onPress
属性,这样就可以通过按钮手动控制监听操作。
编译上面的程序,然后点击监听方法(_startStream
)所在的按钮,就会得到以下运行结果:
//正常的运行结果
I/flutter ( 5894): do one
I/flutter ( 5894): onData: Event One
I/flutter ( 5894): do two
I/flutter ( 5894): onError: Event exception
I/flutter ( 5894): do three
I/flutter ( 5894): onData: Event Three
I/flutter ( 5894): onDone:
从程序的运行结果看,Stream流中包含三个事件,三个事件依次运行,监听方法监听到了事件运行完成后返回的数据。
这和上一章回中程序的运行结果基本相同,不同的地方在于事件运行完成后返回了String类型的数据,并且在监听方法中获取到了这些数据。
如果我们启动监听操作(_startStream
)后,先按下Pause(_pauseStream
)再按下Resume(_resumeStream
)就会得到下面的运行结果:
I/flutter ( 5894): do one
I/flutter ( 5894): do two
I/flutter ( 5894): do three
D/EGL_emulation( 5894): app_time_stats: avg=328.19ms min=11.28ms max=9683.02ms count=31
I/flutter ( 5894): onData: Event One
I/flutter ( 5894): onError: Event exception
I/flutter ( 5894): onData: Event Three
I/flutter ( 5894): onDone:
把该程序的运行结果与上面正常运行的结果做对比后就会发现:第一个事件输出do one
后监听操作的onData
方法没有运行,接着第二个,第三个事件依次运行。这说明监听操作被暂停了,过了一会儿后才运行onData
方法和onDone
方法,这说明监听操作恢复了正常的运行。
建议大家仔细对比上面提供的两种程序运行结果,体会它们之间的不同。同时建议大家自己动手去实践,亲自体会一下手动控制监听操作的过程。这里没有列出与按钮相关的代码,大家可以参考github上ex034文件中的代码去实践。
看官们,关于"如何管理Stream事件流"相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!