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()(多个监听器)
相关推荐
Java面试题总结12 小时前
2026Java面试八股文合集(持续更新)
java·spring·面试·职场和发展·java面试·java八股文
一勺菠萝丶12 小时前
芋道框架 - API 前缀区分机制
java·linux·python
kcuwu.12 小时前
Python判断及循环
android·java·python
前进的李工12 小时前
LangChain使用之Model IO(提示词模版之ChatPromptTemplate)
java·前端·人工智能·python·langchain·大模型
浪游东戴河12 小时前
网线简介及分类
运维·服务器·网络
不知名。。。。。。。。12 小时前
仿muduo库实现高并发---请求HttpRequest模块 响应HttpResponse模块
服务器·c++
ywf121512 小时前
Spring Integration + MQTT
java·后端·spring
程序员Ctrl喵12 小时前
异步编程:Event Loop 与 Isolate 的深层博弈
开发语言·flutter
liuyao_xianhui12 小时前
优选算法_两数之和_位运算_C++
java·开发语言·数据结构·c++·算法·链表·动态规划
李白的粉12 小时前
基于springboot的知识管理系统
java·spring boot·毕业设计·课程设计·知识管理系统·源代码