Flutter---Stream

概念: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()(多个监听器)
相关推荐
alonewolf_9920 分钟前
深入Spring核心原理:从Bean生命周期到AOP动态代理全解析
java·后端·spring
天远Date Lab21 分钟前
Python实现用户消费潜力评估:天远个人消费能力等级API对接全攻略
java·大数据·网络·python
没有bug.的程序员8 小时前
服务安全:内部服务如何防止“裸奔”?
java·网络安全·云原生安全·服务安全·零信任架构·微服务安全·内部鉴权
一线大码8 小时前
SpringBoot 3 和 4 的版本新特性和升级要点
java·spring boot·后端
weixin_440730508 小时前
java数组整理笔记
java·开发语言·笔记
weixin_425023008 小时前
Spring Boot 实用核心技巧汇总:日期格式化、线程管控、MCP服务、AOP进阶等
java·spring boot·后端
一线大码8 小时前
Java 8-25 各个版本新特性总结
java·后端
Xの哲學9 小时前
Linux SMP 实现机制深度剖析
linux·服务器·网络·算法·边缘计算
2501_906150569 小时前
私有部署问卷系统操作实战记录-DWSurvey
java·运维·服务器·spring·开源
better_liang9 小时前
每日Java面试场景题知识点之-TCP/IP协议栈与Socket编程
java·tcp/ip·计算机网络·网络编程·socket·面试题