Dart steam
- Stream Controller : 创建流,对流进行操作
- Skin:Stream Controller的入口,使用Add添加数据
- Stream:Stream Controller的出口
- listener:对Stream进行监听
- 顺序:先入先出
获得Stream的方式
1、 通过构造函数
stream有三种构造方法
- Stream.fromFuture:从Future创建新的单订阅流,当future完成时将触发一个data或者error,然后使用Down事件关闭这个流;
Future<String> getData() async {
await Future.delayed(Duration(seconds: 3));
return '当前时间为:${DateTime.now()}';
}
_streamFromFuture() {
Stream.fromFuture(getData())
.listen((event) => print('Stream.fromFuture -> $event'))
.onDone(() => print('Stream.fromFuture -> done 结束'));
}
输出
Stream.fromFuture -> 当前时间为:2021-03-22 11:56:53.720638
Stream.fromFuture -> down 结束
- Stream.fromFutures:从一组Future创建一个单订阅流,每个future都有自己的data或者error事件,当整个Futures完成后,流将会关闭。如果Futures为空,流将会立刻关闭;
Stream.fromFutures([
Future.delayed(Duration(seconds: 1), () {
return "Hello";
}),
Future.delayed(Duration(seconds: 2),(){
return "World";
}),
Future.delayed(Duration(seconds: 3),(){
throw AssertionError("Error");
}),
Future.delayed(Duration(seconds: 3), () {
return "野猿新一";
})
]).listen((data){
print(data); // 每当一个异步任务成功执行完会回调一次
}, onError: (e){
print(e.message); // 每当一个异步任务发生异常会回调一次
},onDone: (){
print("onDone"); // 虽有异步任务都结束时回调
})
执行结果如下
Hello
World
Error
野猿新一
onDone
- Stream.fromIterable:创建从一个集合中获取其数据的单订阅流。
Stream.fromIntreable([1,2,3]);
2、使用StreamController
//任意类型的流
StreamController controller = StreamController;
controller.sink.add(123);
controller.sink.add('xyz');
controller.sink.add(anything);
//创建一条处理int类型的流
StreamController<int> numController = StreamController();
numController.sink.add(123);
3、 IO Stream