概念:Stream 是一个异步数据序列,可以连续地发出多个值(而不是像 Future 只返回一个值)。
创建Stream的方式:在实际开发中,StreamController 是最常用、最实用的创建流的方式。
最基本的 StreamController 使用
Dart
import 'dart:async';
void main() {
// 1. 创建 StreamController
final controller = StreamController<int>();
// 2. 获取流并进行监听
controller.stream.listen(
(data) {
print('收到数据: $data');
},
onError: (error) {
print('出错: $error');
},
onDone: () {
print('流结束了');
},
);
// 3. 往流里添加数据
controller.add(1); // 输出: 收到数据: 1
controller.add(2); // 输出: 收到数据: 2
controller.add(3); // 输出: 收到数据: 3
// 4. 添加错误
// controller.addError('这是一个错误');
// 5. 关闭流
controller.close(); // 输出: 流结束了
}
StreamController 的核心概念
Dart
StreamController = 水管的总阀门
↓
controller.stream = 水管的出口
↓
.listen() = 在水管出口接个水桶接水
↓
controller.add() = 从阀门往里倒水
↓
controller.close() = 关闭总阀门
使用StreamController创建单订阅流 / 多订阅流
Dart
void streamTypes() {
// 1. 单订阅流 (默认) - 只能有一个监听器
final singleStream = StreamController<int>();
singleStream.stream.listen((data) => print('监听器1: $data'));
// singleStream.stream.listen((data) => print('监听器2: $data')); // 错误!
// 2. 广播流 - 可以有多个监听器
final broadcastStream = StreamController<int>.broadcast();
broadcastStream.stream.listen((data) => print('广播监听器1: $data'));
broadcastStream.stream.listen((data) => print('广播监听器2: $data')); // 可以!
// 添加数据
singleStream.add(1);
broadcastStream.add(1);
singleStream.close();
broadcastStream.close();
}
关键点
Dart
创建:StreamController<T> controller = StreamController<T>();
监听:controller.stream.listen((数据) { ... });
发送数据:controller.add(数据);
发送错误:controller.addError(错误);
关闭:controller.close();
广播流:StreamController<T>.broadcast()(多个监听器)