Dart开发 `Stream` 用法和场景
序
Stream
和 Future
是 Dart:async
提供的核心API,都是为处理异步事件而生。今天我们来重点聊聊 Stream
。Stream
是一系列异步事件的序列,可以理解成一个异步的 Iterable
,不同的是当你向 Iterable
获取下一个事件时它会立即给你,但 Stream
则不会立即给你,而是在它准备好时告诉你。
如何理解 Stream
?
小编在开发中,把 Stream
看作一个 工厂机器
:
- 它有一个入口,可以接收指令(数据),这个机器不知道入口什么时候会放东西进来
- 可再机器内部,根据指令,进行数据加工 (转化层,也可做逻辑层)
- 它有一个出口,当内部指令操作完毕后,会有产品从那出来,我们也不知道什么时候产品会从出口出来
两种类型的工作流
- 类型1:往
Stream
发送数据指令 - 类型2:定制转化层,监听
Stream
如何使用 Stream
?
创建 Stream
这里,小编介绍四种开发中常见的Stream
创建方式
1. 通过定时的方式创建,每秒往stream
流内发送数据1~15
,使用take(15)
做了限制,只轮询15次
var stream = Stream<int>.periodic(const Duration(seconds: 1), (value) => value).take(15);
2. 根据现有数据源创建
var stream = new Stream<int>.fromIterable([1, 2, 3, 4, 5]);
3. 从零创建,使用 yield
关键字,这种方式较为常用,Bloc
里面就是使用的这种方式
// 模拟每秒往流里注入数据
Stream<int> createStream(int maxCount) async* {
int i = 0;
while (true) {
await Future.delayed(Duration(seconds: 1));
yield i ;
if (i == maxCount) break;
}
}
4. 从零创建,使用 StreamController
方式。开发中常用这种方式实现广播效果,文末扩展。
// 模拟每秒往流里注入数据
Stream<int> createStream(int maxCount) {
var controller = new StreamController<int>();
int i = 0;
while (true) {
controller.add(i);
if (i == maxCount) {
controller.close();
break;
}
}
return controller.stream;
}
Stream
分为两种类型:
- 单一模式:
controller.stream
同时只能设置一次监听- 广播模式:
controller.broadcast().stream
同时可设置多个监听
订阅监听 Stream
Stream
底层提供 listen()
方法:
//自来SDK
StreamSubscription<T> listen(void onData(T event)?,
{Function? onError, void onDone()?, bool? cancelOnError});
开发中,常见用法如下: 订阅监听
Stream<int> stream = createStream(15); //生成 1~15 数据的内容流
StreamSubscription<int> subscription;
void onData(int value){
//具体的业务处理,比如打印,依次打印 1 到 15
print(value);
}
//开始监听
subscription = stream.listen(onData);
暂停监听
subscription.pause();
恢复监听
if(subscription.isPaused){
subscription.resume();
}
取消监听
subscription.cancel();
介绍完 Stream
的创建和订阅监听,最后我们来看看 Stream
的转换层如何实现
下面通过代码示例,演示两种方式,将int 类型的 Stream
数值乘以2倍数,并转化成 String 类型的 Stream
1. 使用 iterable
自带函数
Stream<String> transformStream1(Stream<int> stream) {
//方式1:
// return stream.expand<String>((element) => [(element * 2).toString()]);
//方式2:
Future source = stream.map((x) => (x * 2).toString()).toList();
return new Stream<String>.fromFuture(source);
}
2. 使用 transformer
的方式
Stream<String> transformStream2(Stream<int> stream) {
final transFormer = StreamTransformer<int, String>.fromHandlers(
handleData: (value, sink) {
sink.add((value * 2).toString());
},
);
return stream.transform<String>(transFormer);
}
开发中Stream
常用的应用场景
- 可用于实现
广播事件通知
, Flutter使用Stream进行消息通知- 可用于实现
具体业务轮询
, Flutter: Stream 实现定时轮询功能- 结合
Future
、Completer
实现任务队列, Flutter 自定义任务队列
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhegfbkg
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01