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 分钟前
Spring Boot接口国际化异常信息方案
java·spring boot·后端
qq_162987691 分钟前
SpringBoot框架选型
java·spring boot·后端
爱学习的小可爱卢9 分钟前
JavaEE进阶-SpringBoot三层架构:餐厅模式解析
java·java-ee
掉鱼的猫13 分钟前
Java 低代码平台的“动态引擎”:Liquor
java·低代码·groovy
L、21815 分钟前
Flutter 与 OpenHarmony 深度融合实践:打造跨生态高性能应用(进阶篇)
javascript·flutter·华为·智能手机·harmonyos
鹏多多16 分钟前
Flutter输入框TextField的属性与实战用法全面解析+示例
android·前端·flutter
誰能久伴不乏26 分钟前
深入理解 `poll` 函数:详细解析与实际应用
linux·服务器·c语言·c++·unix
安卓开发者26 分钟前
第二课:Dart语言快速入门 - Flutter开发的基石
flutter
倔强的石头10637 分钟前
Linux 进程深度解析(二):进程状态、fork 创建与特殊进程(僵尸 与 孤儿)
linux·运维·服务器
TT哇1 小时前
【Database Navigator 插件】idea 社区版连接 mysql 数据库
java·数据库·mysql·intellij-idea·database