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()(多个监听器)
相关推荐
紧跟先前的步伐1 小时前
Go AI Agent 实战 03|Token、上下文窗口与模型调用成本
java·人工智能·golang
const_qiu2 小时前
第四章 00:开篇 —— 从「会聊天」到「记得住、会干活、能协作」
java·开发语言·人工智能·python
Wang's Blog2 小时前
Java 项目实战: 交友项目 - 个人资料管理的更新接口实现与坑
java·开发语言·交友
Promising_GEO2 小时前
GEE实战02期:从卫星波段开始:利用 Sentinel-2 自己计算 NDVI
java·sentinel·遥感·空间分析
张宇Joaquin2 小时前
AMD uProf 工具采集微架构特征使用介绍
服务器
大文说跨境2 小时前
亚马逊多账号管理浏览器怎么选?云登/紫鸟/AdsPower 对比
java·前端·自动化
CoderYanger2 小时前
Java EE 进阶:4.Spring Web MVC 入门(第一弹)
java·开发语言·前端·spring·面试·java-ee·mvc
老李IT笔记2 小时前
连不上不一定是网不好:新系统不认的服务端配置卡在哪一档
运维·服务器·网络
顽疲3 小时前
java springboot vue 养老系统源码详解:请假 care_leave 销假与床位停费日扣实践
java·vue.js·spring boot
刚入门的大一新生3 小时前
Linux-进程池
linux·运维·服务器