在Dart库中,有两种实现异步编程的方式(Future和Stream),使用它们只需要在代码中引入dart:async即可。
本文主要介绍Stream的相关概念及利用其异步特性来实现简单的响应式编程。
什么是Stream?
为了将Stream的概念可视化与简单化,可以将它想成是管道(pipe)的两端,它只允许从一端插入数据并通过管道从另外一端流出数据。
Stream可以传输什么?
任何东西都可以!包括简单的值,事件,对象,集合,map,error或者其他的Stream,任何类型的数据都可以使用Stream来传输。
如何感知Stream中传输的数据?
当你需要使用Stream中传输的数据时,可以简单地使用listen函数来监听StreamController的stream属性。
在定义完listener(监听者)之后,我们会收到StreamSubscription(订阅)对象,通过这个订阅对象我们就可以接收到Stream发送数据变更的通知。
在定义完listener(监听者)之后,我们会收到StreamSubscription(订阅)对象,通过这个订阅对象我们就可以接收到Stream发送数据变更的通知。
@override void initState() { // TODO: implement initState super.initState(); //传递数据 Stream<String> _strema = Stream.fromFuture(getData()); //监听数据 _strema.listen((data) { print(data); }); } Future<String> getData() async { await Future.delayed(Duration(seconds: 3)); return 'hello'; }
listen参数
StreamSubscription<T> listen(void onData(T event), {Function onError, void onDone(), bool cancelOnError});
onData 有数据的时候执行
onError 发声错误
onDone 数据传递完成
class _StrameDemoHomeState extends State<StrameDemoHome> { @override void initState() { // TODO: implement initState super.initState(); Stream<String> _strema = Stream.fromFuture(getData()); _strema.listen(onData,onDone: onDone,onError: onError); } //有数据执行 void onData(data){ print(data); } //捕获错误 void onError(error){ print("error is $error"); } //数据传递完成 void onDone(){ print("数据传递完成"); } Future<String> getData() async { await Future.delayed(Duration(seconds: 3)); return 'hello'; } @override Widget build(BuildContext context) { return Container( child: Text('strema'), ); } }
Stream.listen()返回的是StreamSubscription对象
StreamSubscription 可以管理事件的订阅。
可以说, StreamController就是如其名字所示一样用来管理其他三个对象的对象。
这是一个事件订阅后的对象,Stream中有两种订阅模式,分别是单点订阅和广播。
表面上用于管理订阅过等各类操作,如 cacenl 、pause ,同时在内部也是事件的中转关键。
StreamSubscription _streamSubScriptConller; @override void initState() { // TODO: implement initState super.initState(); Stream<String> _strema = Stream.fromFuture(getData()); _streamSubScriptConller=_strema.listen(onData,onDone: onDone,onError: onError); }
_streamSubScriptConller.pause()暂停订阅
_streamSubScriptConller.resume() 恢复订阅
_streamSubScriptConller.cancel()//取消订阅,取消后没有办法恢复
发表评论
侧栏公告
寄语
譬如朝露博客是一个分享前端知识的网站,联系方式11523518。
热评文章
标签列表
热门文章
友情链接