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