十七、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