带你读《深入浅出Dart》十七、Dart的Stream(1)

简介: 带你读《深入浅出Dart》十七、Dart的Stream(1)

十七、Dart的Stream

Stream 是 Dart 中处理连续的异步事件的工具。例如,你可以使用 Stream 来读取文件的内容,或者监听用户的鼠标点击。

 

一个简单的 Stream 示例:

Future main() async {
  var stream = Stream.fromIterable([1, 2, 3, 4, 5]);
  await for (var number in stream) {
    print(number);  // 输出:1, 2, 3, 4, 5
  }}

 

在这个示例中,我们使用 Stream.fromIterable 创建了一个 Stream,它将连续地产生 1 到 5 这五个数字。然后我们使用 await for 循环来监听 Stream 的事件。

 

如果你需要在监听 Stream 的过程中处理错误,你可以使用 try/catch

 

Future main() async {
  var stream = Stream.periodic(
    Duration(seconds: 1),
    (x) {
      if (x == 3) {
        throw Exception('Error!');
      } else {
        return x;
      }
    },
  ).take(5);
  try {
    await for (var number in stream) {
      print(number);
    }
  } catch (error) {
    print(error);
  }}

1.创建 Stream

在 Dart 中,你可以使用多种方式来创建 Stream。前面我们已经见到了 Stream.fromIterable,下面是一些其他的方法:

 

  • Stream.empty:创建一个不产生任何事件的 Stream。
  • Stream.error:创建一个只产生一个错误事件的 Stream。
  • Stream.periodic:创建一个周期性地产生事件的 Stream。
  • StreamController:手动控制 Stream 的事件和错误。

例如,我们可以使用 StreamController 创建一个 Stream,并手动控制其事件和错误:

void main() async {
  var controller = StreamController();
  controller.sink.add(1);
  controller.sink.add(2);
  controller.sink.addError('Oops!');
  controller.sink.add(3);
  controller.close();
  await for (var event in controller.stream) {
    print(event);
  }}

 

在这个示例中,我们首先创建了一个 StreamController。然后我们使用 sink.add 方法添加了三个事件,使用 sink.addError 方法添加了一个错误。最后我们使用 controller.close 方法表示我们不会再添加任何事件或错误。

2.处理 Stream 事件

我们可以使用 Stream.listen 方法监听 Stream 的事件:

 

void main() {
  var stream = Stream.fromIterable([1, 2, 3, 4, 5]);
  stream.listen(
    (event) {
      print('Received event: $event');
    },
    onError: (error) {
      print('Received error: $error');
    },
    onDone: () {
      print('All done');
    },
  );}



在这个示例中,我们监听了 Stream 的数据事件、错误事件和完成事件。


带你读《深入浅出Dart》十七、Dart的Stream(2)https://developer.aliyun.com/article/1348630?groupCode=tech_library

相关文章
|
Dart API
带你读《深入浅出Dart》十七、Dart的Stream(2)
带你读《深入浅出Dart》十七、Dart的Stream(2)
230 0
|
8月前
|
存储 人工智能 关系型数据库
云数据库是什么数据库?
云数据库是部署在云计算环境中的数据库服务,用户无需自行搭建硬件和软件环境,通过互联网即可便捷使用。相比传统数据库,云数据库降低了成本和使用门槛,具备强大的扩展性和灵活性,支持多种数据存储模型,并借鉴了关系型数据库的特性如ACID事务处理。它能够应对海量数据和高并发访问需求,适应数字化时代的挑战,未来还将融合更多新技术,进一步提升其功能和应用范围。
701 2
|
7月前
|
机器学习/深度学习 传感器 大数据
大数据如何化解城市交通拥堵的难题?
大数据如何化解城市交通拥堵的难题?
280 5
|
存储 Dart
Dart的Map类型
Dart的Map类型
233 0
|
监控 数据可视化 Java
使用JDK自带的监控工具JConsole来监控线程池的内存使用情况
使用JDK自带的监控工具JConsole来监控线程池的内存使用情况
|
传感器 JSON Dart
Dart笔记:stream_channel 包用法
Dart笔记:stream_channel 包用法
310 0
|
Android开发
android基础:Intents 和 intent-filter 的匹配规则
这篇文章详细解释了Android开发中Intent和<intent-filter>的匹配规则,包括Action、Category和Data的解析规则以及如何通过这些规则匹配隐式Intent。
552 1
|
文字识别 算法 固态存储
OCR -- 文本检测
OCR -- 文本检测
314 0
|
小程序 开发者
uniapp实战 —— 开发微信小程序的调试技巧
uniapp实战 —— 开发微信小程序的调试技巧
1252 1
|
存储 数据库 数据安全/隐私保护
Windows系统部署AnyTXT Searcher并实现远程搜索本地内网设备中文件
Windows系统部署AnyTXT Searcher并实现远程搜索本地内网设备中文件