NIUCLOUD是一款SaaS管理后台框架多应用插件+云编译。上千名开发者、服务商正在积极拥抱开发者生态。欢迎开发者们免费入驻。一起助力发展! 广告
[TOC] ## Stream 1. Stream 的两种类型 - 单订阅 Stream(Single Subscription Stream): - 只能被一个监听者订阅,适合一次性数据流(如文件读取)。 - 示例:StreamController 默认行为。 - 广播 Stream(Broadcast Stream): - 可以被多个监听者订阅,适合多方消费(如 UI 更新)。 - 示例:StreamController.broadcast()。 2. Stream 的状态 - 事件(Data):Stream 发出的值。 - 错误(Error):Stream 可能抛出的异常。 - 完成(Done):Stream 关闭时触发。 2. 操作 Stream - 监听:通过 listen 方法订阅 Stream。 - 转换:使用 map、where 等方法处理数据。 - 控制:通过 StreamController 手动管理数据流。 ## 创建 Stream 示例1 ``` void main() { var stream = Stream.fromIterable([1, 2, 3, 4, 5]); stream.listen((data) => print('Data: $data')); } ``` 示例2 ``` Stream<int> countStream(int max) async* { for (int i = 1; i <= max; i++) { await Future.delayed(Duration(seconds: 1)); // 模拟延迟 yield i; // 发出数据 } } void main() { countStream(3).listen( (data) => print('Count: $data'), onDone: () => print('Stream completed'), ); } ``` ## 使用 StreamController 单订阅 Stream: ``` import 'dart:async'; void main() { var controller = StreamController<String>(); var stream = controller.stream; stream.listen( (data) => print('Received: $data'), onError: (err) => print('Error: $err'), onDone: () => print('Done'), ); controller.add('Hello'); controller.add('Dart'); controller.addError('Something went wrong'); controller.add('World'); controller.close(); // 关闭 Stream } ``` 广播 Stream: ``` import 'dart:async'; void main() { var controller = StreamController<String>.broadcast(); var stream = controller.stream; stream.listen((data) => print('Listener 1: $data')); stream.listen((data) => print('Listener 2: $data')); controller.add('Broadcast Event'); controller.close(); } ``` ## Stream 的操作与转换 map:转换数据 ``` void main() { Stream.fromIterable([1, 2, 3]) .map((num) => num * 2) .listen((data) => print('Mapped: $data')); } ``` where:过滤数据: ``` void main() { Stream.fromIterable([1, 2, 3, 4]) .where((num) => num % 2 == 0) .listen((data) => print('Even: $data')); } ``` take / skip:限制或跳过事件: ``` void main() { Stream.fromIterable([1, 2, 3, 4, 5]) .take(3) // 只取前 3 个 .listen((data) => print(data)); } ```