Flutter Stream 简介及部分操作符使用
return “返回一个Future对象”;。
Stream创建方式
- Stream.fromFuture 接收一个Future对象作为参数
Stream.fromFuture(getData());
Future getData() async{
await Future.delayed(Duration(seconds: 5));
return “返回一个Future对象”;
}
- Stream.fromIterable 接收一个集合对象作为参数
Stream.fromIterable([‘A’,‘B’,‘C’]);
- Stream.fromFutures 接收一个Future集合对象作为参数
Stream.fromFutures([getData()]);
- Stream.periodic 接收一个 Duration对象作为参数
Duration interval = Duration(seconds: 1);
Stream stream = Stream.periodic(interval);
操作方式及使用
使用Stream .periodic 方式创建一个Stream对象
用于创建一个周期发送事件的流,如下
///用于创建一个每隔一秒发送一次无限事件的流,并打印出值
void _stream() async{
Duration interval = Duration(seconds: 1);
Stream stream = Stream.periodic(interval, (data) => data);
await for(int i in stream ){
print(i);
}
}
//(data){return data;} 上面的这句是用来回来值,如果省略这句,打印的值都为null
.
上面创建了一个无限每隔一秒发送一次事件的流,如果我们想指定只发送10个事件则,用take。下面就只会打印出0-9
void _stream() async{
Duration interval = Duration(seconds: 1);
Stream stream = Stream.periodic(interval, (data) => data);
stream = stream.take(10); //指定发送事件个数
await for(int i in stream ){
print(i);
}
}
上面这种方式我们是只制定了发送事件的个数,如果我们也不知道发送多少个事件,我们可以从返回的结果上做一个返回值的限制,上面结果也可以用以下方式实现
void _stream() async {
Duration interval = Duration(seconds: 1);
Stream stream = Stream.periodic(interval, (data) => data);
// stream = stream.take(10);
stream = stream.takeWhile((data) {
return data < 10;
});
await for (int i in stream) {
print(i);
}
}
skip可以指定跳过前面的几个事件,如下会跳过0和1,输出 2-9;
void _stream() async {
Duration interval = Duration(seconds: 1);
Stream stream = Stream.periodic(interval, (data) => data);
stream = stream.take(10);
stream = stream.skip(2);
await for (int i in stream) {
print(i);
}
}
可以指定跳过不发送事件的指定条件,如下跳过0-4的输出,输出5-9
void _stream() async {
Duration interval = Duration(seconds: 1);
Stream stream = Stream.periodic(interval, (data) => data);
stream = stream.take(10);
stream = stream.skipWhile((data) => data<5);
await for (int i in stream) {
print(i);
}
}
将流中所有的数据收集存放在List中,并返回 Future对象,listData里面 0-9
1.这个是一个异步方法,要结果则需要使用await关键字
2.这个是等待Stream当流结束时,一次返回结果
void _stream() async {
Duration interval = Duration(seconds: 1);
Stream stream = Stream.periodic(interval, (data) => data);
stream = stream.take(10);
List listData = await stream.toList();
for (int i in listData) {
print(i);
}
}
这是一种特定的可以用于监听数据流的方式,和 forEach循环的效果一致,但是返回的是
StreamSubscription<T>对象,如下也会输出0-9,同时打印出 ”流已完成“看一下源码这种方式可以接收
StreamSubscription listen(void onData(T event),
{Function onError, void onDone(), bool cancelOnError});
1.
onData是接收到数据的处理,必须要实现的方法2.
onError流发生错误时候的处理3.
onDone流完成时候调取4.
cancelOnError发生错误的时候是否立马终止
void _stream() async {
Duration interval = Duration(seconds: 1);
Stream stream = Stream.periodic(interval, (data) => data);
stream = stream.take(10);
stream.listen((data) {
print(data);
}, onError: (error) {
print(“流发生错误”);
}, onDone: () {
print(“流已完成”);
}, cancelOnError: false);
}
这中操作和
listen()的方式基本差不多,也是一种监听流的方式,这只是监听了onData,下面代码也会输出0-9
void _stream() async {
Duration interval = Duration(seconds: 1);
Stream stream = Stream.periodic(interval, (data) => data);
stream = stream.take(10);
stream.forEach((data) {
print(data);
});
}
用于获取等待流中所有事件发射完成之后统计事件的总数量,下面代码会输出 10
void _stream() async {
Duration interval = Duration(seconds: 1);
Stream stream = Stream.periodic(interval, (data) => data);
stream = stream.take(10);
var allEvents = await stream.length;
print(allEvents);
}
在流中添加筛选条件,过滤掉一些不想要的数据,满足条件返回true,不满足条件返回false,如下我们筛选出流中大于5小于10的数据
void _stream() async {
Duration interval = Duration(seconds: 1);
Stream stream = Stream.periodic(interval, (data) => data);
stream = stream.where((data)=>data>5);
stream = stream.where((data)=> data<10);
await for(int i in stream){
print(i);
}
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。



由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
资源分享
- 最新大厂面试专题
这个题库内容是比较多的,除了一些流行的热门技术面试题,如Kotlin,数据库,Java虚拟机面试题,数组,Framework ,混合跨平台开发,等

- 对应导图的Android高级工程师进阶系统学习视频
最近热门的,NDK,热修复,MVVM,源码等一系列系统学习视频都有!

]
资源分享
- 最新大厂面试专题
这个题库内容是比较多的,除了一些流行的热门技术面试题,如Kotlin,数据库,Java虚拟机面试题,数组,Framework ,混合跨平台开发,等
[外链图片转存中…(img-ANDjCjVY-1710834916427)]
- 对应导图的Android高级工程师进阶系统学习视频
最近热门的,NDK,热修复,MVVM,源码等一系列系统学习视频都有!
[外链图片转存中…(img-kx2Do8rO-1710834916427)]
下载方法:点赞+关注后 点击【Android高级工程师进阶学习】即可领取!
更多推荐


所有评论(0)