在 Flutter 里使用 Stream
前言
在 Flutter 中有两种处理异步操作的方式 Future
和 Stream
,Future
用于处理单个异步操作,Stream
用来处理连续的异步操作。比如往水杯倒水,将一个水杯倒满为一个 Future
,连续的将多个水杯倒满就是 Stream
。
Stream 详解
Stream
是一个抽象类,用于表示一序列异步数据的源。它是一种产生连续事件的方式,可以生成数据事件或者错误事件,以及流结束时的完成事件。
1 | abstract class Stream<T> { |
Stream
分单订阅流和广播流。
单订阅流在发送完成事件之前只允许设置一个监听器,并且只有在流上设置监听器后才开始产生事件,取消监听器后将停止发送事件。即使取消了第一个监听器,也不允许在单订阅流上设置其他的监听器。广播流则允许设置多个监听器,也可以在取消上一个监听器后再次添加新的监听器。
Stream
有同步流和异步流之分。
它们的区别在于同步流会在执行 add
,addError
或 close
方法时立即向流的监听器 StreamSubscription
发送事件,而异步流总是在事件队列中的代码执行完成后在发送事件。
Stream
家族
StreamController
带有控制流方法的流。 可以向它的流发送数据,错误和完成事件,也可以检查数据流是否已暂停,是否有监听器。sync
参数决定这个流是同步流还是异步流。
1 | abstract class StreamController<T> implements StreamSink<T> { |
StreamSink
流事件的入口。提供 add
,addError
,addStream
方法向流发送事件。
1 | abstract class StreamSink<S> implements EventSink<S>, StreamConsumer<S> { |
StreamSubscription
流的监听器。提供 cacenl
、pause
, resume
等方法管理。
1 | abstract class StreamSubscription<T> { |
StreamBuilder
使用流数据渲染 UI 界面的部件。
1 | StreamBuilder( |
创建 Stream
在 Dart 有几种方式创建 Stream
- 从现有的生成一个新的流
Stream
,使用map
,where
,takeWhile
等方法。
1 | // 整数流 |
- 使用
async*
函数。
1 | Stream<int> countStream(int to) async* { |
- 使用
StreamController
。
1 | StreamController<Map> _streamController = StreamController( |
- 使用
Future
对象生成
1 | Future<int> _delay(int seconds) async { |
应用 Stream
Stream Counter
把 Flutter 的默认项目改用 Stream
实现
1 | import 'dart:async'; |
NetWork Status
监听手机的网络链接状态,首先添加 connectivity
插件
1 | dependencies: |
1 | import 'dart:async'; |
Random Article
请求网络数据创建流
1 | dependencies: |
1 | import 'dart:async'; |
Broadcast Stream
使用广播流
1 | import 'dart:async'; |
总结
Stream
是处理异步编程的方式之一,它提供一个了异步的事件序列,并在你准备好接受时发送。在 Dart 中流分为同步流和异步流,以及单订阅流和广播流,有多种方式创建 Stream
。