带你读《深入浅出Dart》十七、Dart的Stream(1)https://developer.aliyun.com/article/1348632?groupCode=tech_library
3.转换 Stream
Stream API 提供了许多方法来转换 Stream。例如,你可以使用 map 方法来处理每个数据事件,或者使用 where 方法来过滤数据事件:
void main() async { var stream = Stream.fromIterable([1, 2, 3, 4, 5]); var evenStream = stream.where((event) => event % 2 == 0).map((event) => event * 2); await for (var event in evenStream) { print(event); // 输出:4, 8 }}
在这个示例中,我们首先使用 where 方法创建了一个只包含偶数的 Stream,然后我们使用 map 方法将每个偶数乘以 2。
4.组合 Stream
你还可以使用 StreamZip 或 StreamGroup 来组合多个 Stream。例如,你可以使用 StreamZip 来同步处理两个 Stream 的数据事件:
void main() async { var stream1 = Stream.periodic(Duration(seconds: 1), (x) => x).take(5); var stream2 = Stream.periodic(Duration(seconds: 2), (x) => x).take(3); var zippedStream = StreamZip([stream1, stream2]); await for (var event in zippedStream) { print(event); // 输出:[0, 0], [1, 1], [2, 2] }}
5.Stream的应用场景
好的,让我详细地解释一下上述的几个应用场景,并提供一些具体的代码示例:
用户界面交互
在 Flutter 等 Dart 构建的应用程序中,Stream 可以用来监听并响应用户的交互行为。例如,你可以创建一个自定义的 StreamController,并使用它来监听按钮点击事件:
// 创建一个 StreamControllerStreamController controller = StreamController(); void main() { // 按钮点击事件监听 controller.stream.listen((data) { print("Button clicked: $data"); }); // 模拟按钮点击 controller.sink.add('Button 1');} // 在你的 UI 中,当按钮被点击时,你可以调用 controller.sink.add 来发送一个事件。
网络请求
在进行网络请求时,服务器的响应通常会分成多个数据包。你可以使用 Stream 来连续地接收和处理这些数据包,这样你就可以在不等待整个响应完成的情况下开始处理数据:
import 'dart:convert';import 'dart:io'; void main() async { var client = HttpClient(); client.getUrl(Uri.parse('https://api.github.com/users/dart-lang/repos')) .then((HttpClientRequest request) { return request.close(); }) .then((HttpClientResponse response) { response.transform(Utf8Decoder()).listen((contents) { print(contents); }); });}
带你读《深入浅出Dart》十七、Dart的Stream(3)https://developer.aliyun.com/article/1348629?groupCode=tech_library