招聘网站开发需要多长时间/怎么发外链

招聘网站开发需要多长时间,怎么发外链,福州网站制作系统,重庆企业网站备案要多久时间Flutter中stream学习 概述Stream的基础概念stream的常用方法Stream.fromFuture(Future<T> future)Stream.fromFutures(Iterable<Future<T>> futures)Stream.fromIterable(Iterable<T> elements)Stream.periodic(Duration period, [T computation(int c…

Flutter中stream学习

  • 概述
  • Stream的基础概念
  • stream的常用方法
    • Stream.fromFuture(Future<T> future)
    • Stream.fromFutures(Iterable<Future<T>> futures)
    • Stream.fromIterable(Iterable<T> elements)
    • Stream.periodic(Duration period, [T computation(int computationCount)?])
    • Stream<T> take(int count)
    • Stream<T> takeWhile(bool test(T element))
    • Stream<T> where(bool test(T event))
    • Stream<T> distinct([bool equals(T previous, T next)])
    • Stream<T> skip(int count)
    • Stream<T> skipWhile(bool test(T element))
    • Stream<S> map<S>(S convert(T event))
    • Stream<S> expand<S>(Iterable<S> convert(T element))
  • Stream的分类
    • 单订阅
    • 广播订阅

概述

Stream 主要应用于 Flutter 的异步操作,在其他编程语言中也存在;Stream 提供了一种接受事件队列的方法,可通过 listen 进行数据监听,通过 error 接收失败状态,通过 done 来接收结束状态;

Stream的基础概念

  • Stream:表示一个可以接收异步事件的数据源。可以生成一个或多个值。
  • StreamController:控制Stream,可以向其添加事件、错误以及关闭它。
  • StreamSubscription:表示对Stream的监听,可以用来取消订阅。
  • Sink:用来向Stream添加数据、错误、以及关闭。

stream的常用方法

Stream.fromFuture(Future future)

Stream通过Future对象创建新的单订阅流, 当Future对象完成时会触发 data / error, 然后已done事件结束

Future<String> getDate() async {await Future.delayed(const Duration(seconds: 3));return "当前时间为${DateTime.now()}";}void testStreamFromFuture() {Stream.fromFuture(getDate()).listen((event) {print("testStreamFromFuture============$event");}).onDone(() {print("testStreamFromFuture==========done 结束");});}

输出结果:
在这里插入图片描述

Stream.fromFutures(Iterable<Future> futures)

Stream 通过一系列的 Future 创建新的单订阅流,每个 Future 都会有自身的 data / error 事件, 当这一系列的 Future 均完成时,Stream 以 done 事件结束;若 Futures 为空,则 Stream 会立刻关闭;其分析源码,很直接的看到是将每一个 Future 事件监听完之后才会执行的微事件结束;

源码代码:

factory Stream.fromFutures(Iterable<Future<T>> futures) {_StreamController<T> controller =new _SyncStreamController<T>(null, null, null, null);int count = 0;// Declare these as variables holding closures instead of as// function declarations.// This avoids creating a new closure from the functions for each future.void onValue(T value) {if (!controller.isClosed) {controller._add(value);if (--count == 0) controller._closeUnchecked();}}void onError(Object error, StackTrace stack) {if (!controller.isClosed) {controller._addError(error, stack);if (--count == 0) controller._closeUnchecked();}}// The futures are already running, so start listening to them immediately// (instead of waiting for the stream to be listened on).// If we wait, we might not catch errors in the futures in time.for (var future in futures) {count++;future.then(onValue, onError: onError);}// Use schedule microtask since controller is sync.if (count == 0) scheduleMicrotask(controller.close);return controller.stream;}

示例代码:

var datas = [getDate(), getDate(), getDate()];Stream.fromFutures(datas).listen((event) {print("testStreamFromFutures============$event");}).onDone(() {print("testStreamFromFutures==========done 结束");});

输出结果:
在这里插入图片描述

Stream.fromIterable(Iterable elements)

Stream 通过数据集合中获取并创建单订阅流,通过 listen 监听迭代器中每一个子 element,当 Stream 监听到取消订阅或 Iterator.moveNext 返回 false / throw 异常 时停止迭代;

void testStreamFromIterable() {var datas = [1, 2, "5.toStroing", false, 9];Stream.fromIterable(datas).listen((event) {print("testStreamFromIterable============$event");}).onDone(() {print("testStreamFromIterable==========done 结束");});}

输出结果:
在这里插入图片描述

Stream.periodic(Duration period, [T computation(int computationCount)?])

Stream 通过 Duration 对象作为参数创建一个周期性事件流,其中若不设置 computation 时 onData 获取数据为 null;若没有事件结束则会一直周期性执行; 因为 computation 函数是返回流的结果

void testStreamPeriodic() {Stream.periodic(const Duration(seconds: 1)).listen((event) {print("testStreamPeriodic===没有computation==================$event");});Stream.periodic(const Duration(seconds: 1), (x) => x).listen((event) {print("testStreamPeriodic---- listen========$event");}).onDone(() {print("testStreamPeriodic==========done 结束");});}

输出结果:
在这里插入图片描述

Stream take(int count)

take() 对于单订阅方式,可以提供 take 设置之前的 Stream 订阅数据,例如设置中断 Stream.periodic 周期展示次数;小菜粗略理解为 take 可以作为中断订阅, 如果 take 设置次数大于 onDone 之前的订阅数据次数,Stream 依旧获取所有 onDone 之前的订阅数据

void testStreamTake() {Stream.periodic(const Duration(seconds: 1), (x) => x).take(5) // 如果不设置这个, 这个流将一直会执行, 但是设置之后只会执行设置的数的次数.listen((event) {print("testStreamTake===========$event");}).onDone(() {print("testStreamTake==============done 结束");});}

输出结果:
在这里插入图片描述

Stream takeWhile(bool test(T element))

takeWhile 也可以实现上述take方法相同效果, 返回一个 boolean 类型,如果为 false 则中断订阅

void testStreamTakeWhile() {Duration interval = const Duration(seconds: 1);Stream<int> streamData = Stream<int>.periodic(interval, (data) => data);streamData.takeWhile((element) {print('Stream.periodic.takeWhile -> $element');return element < 5;}).listen((event) {print('Stream.periodic -> $event');}).onDone(() {print('Stream.periodic -> done 结束');});}

输出结果:
在这里插入图片描述

Stream where(bool test(T event))

where 用于在当前 Stream 中创建一个新的 Stream 用来丢弃不符合 test 的数据;简单理解为类似数据库查询一样,仅过滤符合需求的数据流;且 where 可以设置多次

void testStreamWhere() {Stream.periodic(const Duration(seconds: 1), (data) => data).takeWhile((element) => element <= 5).where((event) {print('Stream.periodic.where -> $event');return event > 3;}).listen((event) {print("testStreamWhere==================$event");}).onDone(() {print("testStreamWhere===================== done 结束");});}

输出结果:
在这里插入图片描述

Stream distinct([bool equals(T previous, T next)])

作用:相邻的两个数据去重哈

void testStreamDistinct() {var datas = [1, 2, '3.toString()', true, true, false, true, 6];Stream.fromIterable(datas).distinct().listen((event) {print("testStreamDistinct===========================$event");}).onDone(() {print('testStreamDistinct============================ done 结束');});}

输出结果:
在这里插入图片描述

Stream skip(int count)

作用: skip 用于跳过符合条件的订阅数据次数 count: 跳过的次数;

void testStreamSkip() {Stream<int> streamData =Stream<int>.periodic(const Duration(seconds: 1), (data) => data + 1);streamData.takeWhile((element) {print('Stream.periodic.takeWhile -> $element');return element <= 6;}).where((event) {print('Stream.periodic.where -> $event');return event > 2;}).skip(2).listen((event) {print('Stream.periodic -> $event');}).onDone(() {print('Stream.periodic -> done 结束');});}

输出结果 :
在这里插入图片描述

Stream skipWhile(bool test(T element))

skipWhile 用于跳过在 where 符合条件下满足设置 条件的订阅数据;即当 返回 为 true 时跳过当前订阅数据监听;

void testSkipWhile() {Stream.periodic(const Duration(seconds: 1), (data) => data).takeWhile((element) => element < 5).skipWhile((element) => element < 3).listen((event) {print("testSkipWhile=========$event");}).onDone(() {print("testSkipWhile========done 结束");});}

输出 结果:
在这里插入图片描述

Stream map(S convert(T event))

在当前 Stream 基础上创建一个新的 Stream 并对当前 Stream 进行数据操作,onData 监听到的是 map 变更后的新的数据流;

void testStreamMap() {// 创还能一个stream刘Stream<int> streamData =Stream<int>.periodic(const Duration(seconds: 1), (data) => data + 1);streamData.takeWhile((element) {print('Stream.periodic.takeWhile -> $element');return element < 5;}).map((event) {print('Stream.periodic.map -> $event -> ${event * 100}');return event * 100;}).listen((event) {print('Stream.periodic -> $event');}).onDone(() {print('Stream.periodic -> done 结束');});}

输出结果:
在这里插入图片描述

Stream expand(Iterable convert(T element))

在当前 Stream 基础上创建新的 Stream 并将当前订阅数据转为新的订阅数据组,onData 监听 数据组 中每个新的订阅数据元素;

void testStreamExpand() {Stream<int> streamData =Stream<int>.periodic(const Duration(seconds: 1), (data) => data + 1);streamData.takeWhile((element) {print('Stream.periodic.takeWhile -> $element');return element <= 6;}).expand((element) {print('Stream.periodic.expand -> $element -> ${element * 10} -> ${element * 100}');return [element, element * 10, element * 100];}).listen((event) {print('Stream.periodic -> $event');}).onDone(() {print('Stream.periodic -> done 结束');});}

输出结果:
在这里插入图片描述

Stream的分类

单订阅

默认情况下Streams会被设置成单订阅,点订阅会保持当前的值,直到有其它的订阅。

单订阅Stream(Single-Subscription Stream)一次只能有一个监听器(listener),当我们对单订阅进行监听的时候,程序会被错。通常用于一次性事件

void testStreamController() {// 使用streamController创建一个streamfinal streamController = StreamController<int>();// 获取stream流final stream = streamController.stream;// 监听streamstream.listen((event) {print("testStreamController========================$event");});// stream.listen((event) {//   print("testStreamController=11111=======================$event");// });// 添加测试数据到streamstreamController.sink.add(1);streamController.sink.add(2);streamController.sink.add(3);// 关闭stream流streamController.close();}

如果我打开上述注释掉的监听, 对一个单订阅的stream进行多次监听会报如下错误:
在这里插入图片描述

广播订阅

广播(Broadcast Stream)允许多个监听器,可以同时向多个订阅者推送数据。 这种类型适合用于事件广播,比如用户操作、全局数据推送等。

void testStreamBoardcast() {final streamController = StreamController<int>.broadcast();final stream = streamController.stream;stream.listen((event) {print("testStreamBoardcast==============$event");});stream.listen((event) {print("testStreamBoardcast111111111===================$event");});streamController.sink.add(1);streamController.sink.add(2);streamController.sink.add(3);streamController.close();}

输出结果:
在这里插入图片描述

除此之外Flutter官方还提供了StreamBuilder这种专门用于监听Stream并根据数据变化更新UI的Widget。具体用法可以参考官方文档。

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

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

相关文章

基于javaweb的SSM房屋租赁管理系统设计和实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…

物联网商业模式

物联网商业模式是一种战略规划&#xff0c;它融合了物联网技术来创造价值并获取收入。它与传统商业模式的不同之处在于&#xff0c;它利用互联设备来改善运营、提升客户体验以及优化服务项目。在当今由科技驱动的世界中&#xff0c;这种商业模式通过利用实时数据来提供创新服务…

从0开始的操作系统手搓教程45——实现exec

目录 建立抽象 实现加载 实现sys_execv &#xff01;&#xff01;&#xff01;提示&#xff1a;因为实现问题没有测试。所以更像是笔记&#xff01; exec 函数的作用是用新的可执行文件替换当前进程的程序体。具体来说&#xff0c;exec 会将当前正在运行的用户进程的进程体&…

【python爬虫】酷狗音乐爬取练习

注意&#xff1a;本次爬取的音乐仅有1分钟试听&#xff0c;仅作学习爬虫的原理&#xff0c;完整音乐需要自行下载客户端。 一、 初步分析 登陆酷狗音乐后随机选取一首歌&#xff0c;在请求里发现一段mp3文件&#xff0c;复制网址&#xff0c;确实是我们需要的url。 复制音频的…

Linux开发工具----vim

目录 Linux编辑器-vim使用 1. vim的基本概念 正常/普通/命令模式(Normal mode) 插入模式(Insert mode) 底行模式(last line mode) 2. vim的基本操作 3. vim正常模式命令集 4. vim底行模式命令集 5. vim操作总结 (本篇文章相当于vim常用命令字典) Linux编辑器-vim使用 我们先来看…

基于云函数的自习室预约微信小程序+LW示例参考

全阶段全种类学习资源&#xff0c;内涵少儿、小学、初中、高中、大学、专升本、考研、四六级、建造师、法考、网赚技巧、毕业设计等&#xff0c;持续更新~ 文章目录 [TOC](文章目录) 1.项目介绍2.项目部署3.项目部分截图4.获取方式 1.项目介绍 技术栈工具&#xff1a;云数据库…

卷积神经网络与计算机视觉:从数学基础到实战应用

卷积神经网络与计算机视觉&#xff1a;从数学基础到实战应用 摘要 本文深入解析卷积神经网络&#xff08;CNN&#xff09;的核心原理及其在计算机视觉中的应用。首先介绍卷积与互相关的数学定义及在神经网络中的实际应用差异&#xff0c;接着从系统设计视角分析卷积的线性代数…

从Manus到OpenManus:多智能体协作框架如何重构AI生产力?

文章目录 Manus&#xff1a;封闭生态下的通用AI智能体OpenManus&#xff1a;开源社区的闪速复刻挑战与未来&#xff1a;框架落地的现实边界当前局限性未来演进方向 OpenManus使用指南1. 环境配置2. 参数配置3. 替换搜索引擎4. 运行效果 协作框架开启AI生产力革命 Manus&#xf…

js 使用 Web Workers 来实现一个精确的倒计时,即使ios手机锁屏或页面进入后台,倒计时也不会暂停。

## 效果如上 <!-- 将 main.js 和 worker.js 放在同一个目录下&#xff0c;然后在 HTML 文件中引入 main.js --><!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content&q…

Docker Compose国内镜像一键部署dify

克隆代码 git clone https://github.com/langgenius/dify.git进入docker目录 cd docker修改.env部分 # 将环境模版文件变量重命名 cp .env.example .env # 修改 .env,修改nginx的host和端口,避免端口冲突 NGINX_SERVER_NAME192.168.1.223 NGINX_PORT1880 NGINX_SSL_PORT1443…

NO.29十六届蓝桥杯备战|string九道练习|reverse|翻转|回文(C++)

P5015 [NOIP 2018 普及组] 标题统计 - 洛谷 #include <bits/stdc.h> using namespace std;int main() {ios::sync_with_stdio(false);cin.tie(nullptr);string s;getline(cin, s);int sz s.size();int cnt 0;for (int i 0; i < sz; i){if (isspace(s[i]))continue…

嵌入式音视频通话SDK组件EasyRTC:全平台设备兼容,智能硬件里的WebRTC调用实践

在万物互联时代&#xff0c;智能硬件设备对实时音视频通信的需求呈现爆发式增长。传统基于PC或移动端的WebRTC方案难以满足嵌入式设备在资源占用、低延迟传输和硬件适配等方面的特殊需求。本文将深入探讨如何通过EasyRTC嵌入式音视频通信SDK在嵌入式设备中实现高效的WebRTC视频…

Aim Robotics电动胶枪:机器人涂胶点胶的高效解决方案

在自动化和智能制造领域&#xff0c;机器人技术的应用越来越广泛&#xff0c;而涂胶和点胶作为生产过程中的重要环节&#xff0c;也逐渐实现了自动化和智能化。Aim Robotics作为一家专注于机器人技术的公司&#xff0c;其推出的电动胶枪为这一领域带来了高效、灵活且易于操作的…

c语言笔记 数组进阶题目的理解

题目&#xff1a;声明一个二维 int 型数组 a&#xff0c;再声明另一个一维数组指针数组 b&#xff0c;使该数组 b 的每一个指针分别指向二维数组 a 中的每一个元素(即每一个一维数组)&#xff0c;然后利用数组 b 计算数组 a 的和。 图解&#xff1a;画图帮助理解 我们要清楚什…

Photo Works在线图片编辑器:一键修复老照片,轻松焕新记忆

★【概况介绍】 今天突然收到我的朋友电脑出故障了,截图给我,我一看就知道这个是缺少必要的组件引起的故障。结合这个问题,我来谈谈自己的解决思路和方法,希望能够帮助到大家。帮助大家是我最开心的事情。以前只是帮朋友解决问题,没有记录下来,刚刚接触到这个平台,刚好可…

FANformer:融合傅里叶分析网络的大语言模型基础架构

近期大语言模型(LLM)的基准测试结果引发了对现有架构扩展性的思考。尽管OpenAI推出的GPT-4.5被定位为其最强大的聊天模型&#xff0c;但在多项关键基准测试上的表现却不及某些规模较小的模型。DeepSeek-V3在AIME 2024评测中达到了39.2%的Pass1准确率&#xff0c;在SWE-bench Ve…

【 IEEE出版 | 快速稳定EI检索 | 往届已EI检索】2025年储能及能源转换国际学术会议(ESEC 2025)

重要信息 主会官网&#xff1a;www.net-lc.net 【论文【】投稿】 会议时间&#xff1a;2025年5月9-11日 会议地点&#xff1a;中国-杭州 截稿时间&#xff1a;见官网 提交检索&#xff1a;IEEE Xplore, EI Compendex, Scopus 主会NET-LC 2025已进入IEEE 会议官方列表!&am…

react基础语法视图层类组件

react基础语法视图层&类组件 MVVM *区别mvc&mvvm 两者的区别&#xff1a; 数据模型去渲染视图。数据层改了&#xff0c;vue自己会监听到帮我们拿最新的数据去渲染视图&#xff1b;构建数据构建视图&#xff0c;数据驱动的思想。这一套是非常相似的。 视图中的内容改变&…

开发、科研、日常办公工具汇总(自用,持续更新)

主要记录汇总一下自己平常会用到的网站工具&#xff0c;方便查阅。 update&#xff1a;2025/2/11&#xff08;开发网站补一下&#xff09; update&#xff1a;2025/2/21&#xff08;补充一些AI工具&#xff0c;刚好在做AI视频相关工作&#xff09; update&#xff1a;2025/3/7…

51c大模型~合集10

我自己的原文哦~ https://blog.51cto.com/whaosoft/11547799 #Llama 3.1 美国太平洋时间 7 月 23 日&#xff0c;Meta 公司发布了其最新的 AI 模型 Llama 3.1&#xff0c;这是一个里程碑时刻。Llama 3.1 的发布让我们看到了开源 LLM 有与闭源 LLM 一较高下的能力。 Meta …