全面解析Flutter中的Stream用法及实际应用

目录

前言

1. 什么是Stream?

2. Stream的分类

1.单订阅Stream

2.广播Stream (Broadcast Stream):

3. Stream的基础用法

1.创建

1.使用Stream.periodic

2.使用StreamController

2.监听

3.关闭Stream

4.Stream 转换与处理

1.map

2.asyncMap

5.实际应用场景

6.完整示例:计数器应用


前言

1. 什么是Stream?

        在 Flutter 中,Stream 是一种用于处理异步数据流的工具。它的作用类似广播频道,允许连续推送数据流,并让其他部分实时监听这些数据。Stream 广泛应用于需要异步处理的场景,比如网络请求、用户输入、数据流实时更新等。

2. Stream的分类

        在 Flutter 中,Stream 分为两类:

1.单订阅Stream

        单订阅Stream(Single-Subscription Stream)一次只能有一个监听器(listener)。

        通常用于一次性的事件,比如从 API 获取数据。

2.广播Stream (Broadcast Stream):

        广播(Broadcast Stream)允许多个监听器,可以同时向多个订阅者推送数据。

        这种类型适合用于事件广播,比如用户操作、全局数据推送等。

3. Stream的基础用法

1.创建

        可以使用 Stream 的构造方法,也可以通过 StreamController 自定义数据流。

1.使用Stream.periodic

        我们可以使用Stream.periodic定时生成数据流:

Stream<int> numberStream = Stream.periodic(Duration(seconds: 1), (count) => count);

2.使用StreamController

        Flutter还可以使用StreamController手动推送数据。

final StreamController<int> controller = StreamController<int>();

Stream<int> myStream = controller.stream;

controller.sink.add(1); // 推送数据

2.监听

        使用 listen 方法可以轻松监听 Stream 的数据变化。

myStream.listen((data) {

  print('Received: $data');

});

3.关闭Stream

        使用 StreamController 时,在不再需要时调用 close 方法来释放资源,防止内存泄漏。

controller.close();

4.Stream 转换与处理

        Stream 提供了许多用于数据流转换和处理的方法,比如 map、where、asyncMap 等。可以使用这些方法高效地处理流数据。

1.map

        用于将数据流的每个元素映射成不同的值。

myStream.map((value) => value * 2).listen((data) {

  print('Mapped Value: $data');

});

2.asyncMap

        用于异步处理每个数据元素。

myStream.asyncMap((value) async {

  return await Future.delayed(Duration(seconds: 1), () => value * 2);

}).listen((data) {

  print('Async Mapped Value: $data');

});

5.实际应用场景

        Flutter中Stream的应用场景如下:

  1. 网络请求:使用 Stream 可以轻松处理 HTTP 请求响应,尤其适合需要连续多次请求的场景。
  2. 用户输入监听:监听用户输入变化,比如搜索框的输入变化。
  3. 实时数据更新:比如股票、天气、聊天应用等需要实时数据推送的场景。
  4. 多事件处理:多个监听器同时监听并响应同一个事件源,比如按钮点击。

6.完整示例:计数器应用

        下面是一个简单的计数器应用示例,展示了 Stream 在应用中如何工作:

import 'dart:async';import 'package:flutter/material.dart';class StreamMainPage extends StatefulWidget {const StreamMainPage({super.key,});@overrideState<StreamMainPage> createState() => _StreamMainPageState();
}class _StreamMainPageState extends State<StreamMainPage> {final StreamController<int> _controller = StreamController<int>();int _counter = 0;@overridevoid initState() {super.initState();// 使用 Timer.periodic 定时自增计数器Timer.periodic(const Duration(seconds: 1), (timer) {_counter++;_controller.sink.add(_counter);});}@overridevoid dispose() {_controller.close(); // 关闭 Stream 防止内存泄漏super.dispose();}@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(backgroundColor: Colors.purple,title: const Text('Stream用法',style: TextStyle(color: Colors.white,fontWeight: FontWeight.bold,fontSize: 16),),),body: Center(child: StreamBuilder<int>(stream: _controller.stream,builder: (context, snapshot) {if (snapshot.hasData) {return Text('Counter: ${snapshot.data}',style: const TextStyle(fontSize: 24));} else {return const CircularProgressIndicator();}},),),);}
}

7.总结

        在 Flutter 中,Stream 是一种处理异步事件流的利器,适用于需要实时推送和监听数据的场景。通过 Stream 可以实现高效的数据流处理和转换,尤其适合需要异步响应的 UI 场景。在实际应用中,合理使用 Stream 可以使代码更加简洁和高效,也能够极大地改善用户体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/464578.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《TCP/IP网络编程》学习笔记 | Chapter 1:理解网络编程和套接字

《TCP/IP网络编程》学习笔记 | Chapter 1&#xff1a;理解网络编程和套接字 《TCP/IP网络编程》学习笔记 | Chapter 1&#xff1a;理解网络编程和套接字基本概念服务端客户端 基于 Linux 平台的 "Hello world!" 服务端和客户端基于 Linux 的文件操作打开文件关闭文件…

C#-类:声明类、声明类对象

一&#xff1a;类的声明 class 类名 {//特征——成员变量//行为——成员方法//保护特征——成员属性//构造函数和析构函数//索引器//运算符重载//静态成员 }类名&#xff1a;帕斯卡 同一个语句块中的不同类 不能重名 二&#xff1a;声明类对象 2.1 类的声明 ≠ 类对象的声…

qt QProgressBar详解

1、概述 QProgressBar是Qt框架中的一个控件&#xff0c;专门用于显示任务的进度。它提供了一个可视化的进度条&#xff0c;让用户能够直观地了解任务的完成程度。QProgressBar支持水平和垂直两种显示方向&#xff0c;并且可以通过设置最小值和最大值来指定进度条的范围。此外&…

Node.js 入门指南:从零开始构建全栈应用

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;node.js篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来node.js篇专栏内容:node.js-入门指南&#xff1a;从零开始构建全栈应用 前言 大家好&#xff0c;我是青山。作…

基于vue框架的的冷链食品物流信息管理系统v81wb(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,司机,冷链食品,冷链食品订单,冷链车辆,配送信息,订单费用,站点信息,食品种类,省,市,食品质量,县 开题报告内容 基于Vue框架的冷链食品物流信息管理系统开题报告 一、研究背景与意义 随着全球食品贸易的快速发展和消费者对食品品质…

使用GetX实现GetPage中间件

前言 GetX 中间件&#xff08;Middleware&#xff09;是 GetX 框架中的一种机制&#xff0c;用于在页面导航时对用户进行权限控制、数据预加载、页面访问条件设置等。通过使用中间件&#xff0c;可以有效地控制用户的访问流程&#xff0c;并在适当条件下引导用户到所需页面。 这…

你知道Mac也能拥有丰富的右键菜单栏吗?

Mac的右键菜单栏功能少的可怜&#xff0c;和Windows没法比&#xff0c;所以许多朋友在使用Mac会有很多不习惯的地方&#xff0c;但是Mac的右键菜单栏也能够拥有超多功能&#xff0c;甚至丰富程度可以超越Windows&#xff0c;你知道吗 超级右键能够丰富拓展Mac的右键菜单栏&…

Spring Boot 注解大全:全面解析 Spring Boot 常用注解及其应用场景

Spring Boot 注解大全:全面解析 Spring Boot 常用注解及其应用场景 简介 Spring Boot 是一个基于 Spring 框架的简化开发框架,它旨在简化 Spring 应用的初始搭建和开发过程。Spring Boot 提供了一系列的注解,使得开发者可以更加方便地进行应用开发和配置。本文将详细介绍 S…

使用 Elasticsearch 进行语义搜索

Elasticsearch 是一款功能强大的开源搜索引擎&#xff0c;可用于全文搜索、分析和数据可视化。传统上&#xff0c;Elasticsearch 以其执行基于关键字/词汇的搜索的能力而闻名&#xff0c;其中文档基于精确或部分关键字匹配进行匹配。然而&#xff0c;Elasticsearch 已经发展到支…

(一)<江科大STM32>——软件环境搭建+新建工程步骤

一、软件环境搭建 &#xff08;1&#xff09;安装 Keil5 MDK 文件路径&#xff1a;江科大stm32入门教程资料/Keil5 MDK/MDK524a.EXE&#xff0c;安装即可&#xff0c;路径不能有中文。 &#xff08;2&#xff09;安装器件支持包 文件路径&#xff1a;江科大stm32入门教程资料…

【顶刊核心变量】上市公司企业数字创新数据(数字产品、流程、业务模式创新(2001-2023年)

1.资料名称&#xff1a;2023-2001年上市公司企业数字创新数据 2.测算方式&#xff1a;参考《系统工程理论与实践》郑攀攀&#xff08;2024&#xff09;老师的做法&#xff0c;本文基于上市公司年报文本, 结合文本分析和机器学习方法, 测度了企业数字创新(DI) . 具体的测度步骤…

在K8s平台部署个人博客

在K8s平台部署个人博客 实验步骤查看wordpress前端的service配置word press 实验步骤 kubectl create secret generic mysql-pass --from-literalpasswordYOUR_PASSWORD把mysql.tar.gz和wordpress.tar.gz上传到K8s工作节点&#xff0c;手动解压即可&#xff1a; 通过网盘分享的…

Qt项目实战:红绿灯小程序

目录 一.初始化对象 二.捕获并处理特定的事件 三.自定义绘制方法 四.绘制外部边框 五.绘制内部边框 六.绘制按钮的背景色 七.绘制覆盖层&#xff08;高光效果&#xff09; 八.效果 九.代码 1.h 2.cpp 一.初始化对象 1.设置文本、颜色、边框和背景色等默认值。 2.安…

408——计算机网络(持续更新)

文章目录 一、计算机网络概述1.1 计算机网络的概念1.2 计算机网络体系结构1.3 总结 二、物理层2.1 物理层的基本概念2.2 物理层的基本通信技术2.3 总结 一、计算机网络概述 1.1 计算机网络的概念 计算机网络的定义&#xff1a;将地理位置不同的具有独立功能的计算机通过网络线路…

算法简介:K最近邻算法

KNN 1. 最近邻算法1.1 回归 2. 机器学习OCR创建垃圾邮件过滤器预测股票市场 1. 最近邻算法 KNN&#xff08;k-nearest neighbours&#xff09;K最近邻算法&#xff1a;采用此算法进行分类&#xff0c;检索距离该元素最近的几个元素是什么类型&#xff0c;那么该元素即为什么类…

力扣动态规划基础版(矩阵型)

62.不同路径&#xff08;唯一路径问题&#xff09; 62. 不同路径https://leetcode.cn/problems/unique-paths/ 方法一&#xff1a;动态规划 找状态转移方程&#xff0c;也就是说它从左上角走到右下角&#xff0c;只能往右或者往下走&#xff0c;那么设置一个位置为&#xff…

adb 常用命令汇总

目录 adb 常用命令 1、显示已连接的设备列表 2、进入设备 3、安装 APK 文件到设备 4、卸载指定包名的应用 5、从设备中复制文件到本地 6、将本地文件复制到设备 7、查看设备日志信息 8、重启设备 9、截取设备屏幕截图 10、屏幕分辨率 11、屏幕密度 12、显示设备的…

基于大语言模型(LLM)自主Agent 智能体综述

近年来,LLM(Large Language Model)取得了显著成功,并显示出了达到人类智能的巨大潜力。基于这种能力,使用LLM作为中央控制器来构建自助Agent,以获得类人决策能力。 Autonomous agents 又被称为智能体、Agent。指能够通过感知周围环境、进行规划以及执行动作来完成既定任务。…

node.js模块化分析

什么是Node.js模块化 Node.js中的模块化‌是指将一个大文件拆分成独立且相互依赖的多个小模块。每个JS文件被视为一个独立的模块&#xff0c;模块之间是互相不可见的。如果一个模块需要使用另一个模块&#xff0c;则需要使用指定的语法来引入该模块&#xff0c;并且只能使用模块…

openstack之guardian介绍与实例创建过程

运行特征 采集模块&#xff1a;扩展Ceilometer&#xff0c;采集存储网、业务网连通性、nova目录是否可读写&#xff1b; 收集模块&#xff1a;将采集到的数据存储到数据库中&#xff1b; 分析模块&#xff1a;根据采集的结果&#xff0c;分析各节点状态&#xff0c;并进行反向检…