美文网首页Android
Dart:总结开发中 `Stream` 用法及场景

Dart:总结开发中 `Stream` 用法及场景

作者: 李小轰 | 来源:发表于2021-11-10 17:13 被阅读0次

StreamFutureDart:async提供的核心API,都是为处理异步事件而生。今天我们来重点聊聊 StreamStream 是一系列异步事件的序列,可以理解成一个异步的 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 常用的应用场景

相关文章

  • Dart:总结开发中 `Stream` 用法及场景

    序 Stream 和 Future 是 Dart:async提供的核心API,都是为处理异步事件而生。今天我们来重...

  • Laravel 开发笔记

    Laravel 笔记 前言 记录 Laravel 开发中的问题,及笔记。 用法 Validator 类的用法 用法...

  • java stream api reduce与collect的用

    java stream api reduce与collect的用法差异 java stream api中 redu...

  • Flutter中Dart基础

    Flutter是基于Dart语音开发的,Dart是面向对象的语言,下面记录一些Dart语言常用数据类型的用法。 1...

  • Flutter 知识梳理 (Dart) - Dart 和 Jav

    在学习Dart的时候,会遇到一些Java中没有的概念或者用法,这篇文章总结了Dart和Java中一些不同,但又经常...

  • java stream中Collectors的用法

    java stream中Collectors的用法 简介 在java stream中,我们通常需要将处理后的str...

  • Flutter响应式编程 - Stream

    在Dart库中,有两种实现异步编程的方式(Future和Stream),使用它们只需要在代码中引入dart:asy...

  • Dart Stream

    Stream Dart中的流概念和Java8中的流概念非常相似。 在同步的世界里:一个数据可以用一个对象表示,众多...

  • Stream in Dart

    大家应该都吃过转盘小火锅吧,情形是这样的的:好多个人坐在一块,围着一条传送带,每个人的位置上都会有一个小火锅,厨师...

  • Dart - Stream

    Core Stream types There are two kinds of streams: "Single...

网友评论

    本文标题:Dart:总结开发中 `Stream` 用法及场景

    本文链接:https://www.haomeiwen.com/subject/pvkizltx.html