Stream可以说是构成Dart响应式流编程重要组成部分。还记得之前文章中说过的Future吗,我们知道每个Future代表单一的值,可以异步传送数据或异常。而Stream的异步工作方式和Future类似,只是Stream代表的是一系列的事件,那么就可能传递任意数据值,可能是多个值也可以是异常。比如从磁盘中读取一个文件,那么这里返回的就是一个Stream。此外Stream是基于事件流订阅的机制来运转工作的。
首先,在Dart单线程模型中,要实现异步就需要借助类似Stream、Future之类的API实现。所以Stream可以很好地实现Dart的异步编程。
此外,在Dart中一些异步场景中,比如磁盘文件、数据库读取等类似需要读取一系列的数据时,这种场景Future是不太合适的,所以在一些需要实现一系列异步事件时Stream就是不错的选择,Stream提供一系列异步的数据序列。换个角度理解Stream就是一系列的Future组合,Future只能有一个异步响应,而Stream就是一系列的异步响应。
官方说法:Dart通过使用streams对于异步数据流有着非常好的支持
Stream<int> count() async*{ int i=1; while(true){ yield i++; } }
如何使用Stream?使用StreamBuilder就可以做到!StreamBuilder会监听Stream事件,会为每一个时间都创建一个句柄,以便让他们在最新的时间上进行工作。
StreamBuilder<int>(
stream:_myStream,//传递stream参数
builder:(context,snapshot){
return MyWidget(snapshot.data);//snap参数表示当前应用所拥有的状态
}
);