Flutter中Future和Stream關系

????????Future和Stream類是Dart異步編程的核心。

????????Future?表示一個不會立即完成的計算過程。與普通函數直接返回結果不同的是異步函數返回一個將會包含結果的?Future。該?Future?會在結果準備好時通知調用者。

????????Stream?是一系列異步事件的序列。其類似于一個異步的?Iterable,不同的是,當你向?Iterable?獲取下一個事件時它會立即給你,但是?Stream?則不會立即給你而是在它準備好時告訴你。

????????Future和Stream的本質區別是:Future中的任務會加入下一輪事件循環,而Stream中的任務則是加入微任務隊列。

Future 用于表示單個運算的結果,而 Stream 則表示多個結果的序列。
Stream中的執行異步的模式就是scheduleMicrotask。因為microtask的優先級又高于event。
所以,如果 microtask 太多就可能會對觸摸、繪制等外部事件造成阻塞卡頓。

????????一個Stream可以通過Stream.fromFuture方法將一個Future轉換為Stream,?也可以通過Stream.fromFutures將多個Future添加到Stream中。

????????Stream分為Single?Subscription和Broadcast兩種類型,?前者只允許訂閱(listen)一次,后者允許多次訂閱。

// 1. Single-Subscription
var data = [1, 2, '3.toString()', true, true, false, true, 6];
Stream stream = Stream.fromIterable(data).distinct();
stream.listen((event) => print('Liste1 -> Stream.fromIterable -> $event')).onDone(() => print('onDone1 -> Stream.fromIterable -> done 結束'));
stream  //報錯.listen((event2) => print('Liste2 -> Stream.fromIterable -> $event2')).onDone(() => print('onDone2 -> Stream.fromIterable -> done 結束'));
// 2. Broadcast 所有數據被打印兩次
var data = [1, 2, '3.toString()', true, true, false, true, 6];
Stream stream = Stream.fromIterable(data).distinct();
stream = stream.asBroadcastStream();
stream.listen((event) => print('Liste1 -> Stream.fromIterable -> $event')).onDone(() => print('onDone1 -> Stream.fromIterable -> done 結束'));
stream .listen((event2) => print('Liste2 -> Stream.fromIterable -> $event2')).onDone(() => print('onDone2 -> Stream.fromIterable -> done 結束'));

????????通過StreamController向Stream中添加數據:

//1. 通過StreamController創建stream并添加數據(1)
StreamController<String> _streamControler = StreamController<String>();
_streamControler.stream.listen(onData:onData, onError: onError, onDone: onDone);
_streamControler.add(await getData());//2. 通過StreamController的Sink添加數據(2)
StreamController<String> _streamControl = StreamController<String>();
Sink _sink=_streamControler.sink;
_sink.add(await getData());

? ? ? ? 通過StreamBuilder可以用來實現界面的異步構建,其作用類似于FutureBuilder。但StreamBuilder能力更強,可以等待多個異步事件完成,然后再執行Widget的構建。

StreamBuilder<List<String>>(stream: dataStream,initialData: ["none"],///這里的 snapshot 是數據快照的意思builder: (BuildContext context, AsyncSnapshot<List<String>> snapshot) {///獲取到數據,為所欲為的更新 UIvar data = snapshot.data;return Container();});

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/713895.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/713895.shtml
英文地址,請注明出處:http://en.pswp.cn/news/713895.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AutoEncoder和 Denoising AutoEncoder學習筆記

參考&#xff1a; 【1】 https://lilianweng.github.io/posts/2018-08-12-vae/ 寫在前面&#xff1a; 只是直覺上的認識&#xff0c;并沒有數學推導。后面會寫一篇&#xff08;抄&#xff09;大一統文章&#xff08;概率角度理解為什么AE要選擇MSE Loss&#xff09; TOC 1 Au…

1907_Arm Cortex-M3的基本了解

1907_Arm Cortex-M3的基本了解 全部學習匯總&#xff1a; g_arm_cores: ARM內核的學習筆記 (gitee.com) 我發現Arm Coretex-M3有一個專門的DataSheet&#xff0c;看起來這個的確是被當做了一個設計的產品來對待的。正好&#xff0c;基于這個文件來看看M3具備哪些基本的特性&…

GO—變量

Go語言是靜態類型語言&#xff0c;因此變量&#xff08;variable&#xff09;是有明確類型的&#xff0c;編譯器也會檢查變量類型的正確性。 我們從計算機系統的角度來講&#xff0c;變量就是一段或者多段內存&#xff0c;用于存儲數據 1.1 標準格式 var 變量名 變量類型 1 …

vue 使用vue-scroller 列表滑動到底部加載更多數據

安裝插件 npm install vue-scroller -dmain.js import VueScroller from vue-scroller Vue.use(VueScroller)<template><div class"wrap"><div class"footer"><div class"btn" click"open true">新增</d…

多層控制上身姿態的方法

1選擇要施加的clip并調出層控制窗口 2點選motion層控制 3選擇并復制pose&#xff08;注意在哪個層中選中的情況下復制的是那個層中的pose&#xff09; 4在新建層中分別選擇頭幀粘貼pose和尾幀粘貼pose因是上半身&#xff0c;因此mask中把下半身去掉即變灰

提升工作能力的方法

1.接受工作&#xff0c;只問標準 2.請示工作&#xff0c;必帶方案&#xff1b; 3.匯報工作&#xff0c;突出成果&#xff1b; 4.分享工作&#xff0c;細說流程&#xff1b; 5.復盤工作&#xff0c;總結SOP 如果能這么做&#xff0c;那將是一個非常通透的高手&#xff0c;所以高…

如何使用 takeUntil RxJS 操作符來聲明性地管理訂閱

簡介 Angular 處理取消訂閱可觀察對象的操作&#xff0c;比如從 HTTP 服務返回的可觀察對象或者使用 async 管道時。然而&#xff0c;對于其他情況&#xff0c;管理所有訂閱并確保取消長期存在的訂閱可能會變得困難。而且&#xff0c;取消大部分訂閱的策略也會帶來自己的問題。…

2024年春招小紅書前端實習面試題分享

文章目錄 導文面試重點一、方便介紹一下&#xff0c;你之前實習都做了什么嘛&#xff1f;二、 可以講一下封裝組件相關邏輯嘛&#xff1f;1. 為什么要封裝組件&#xff1f;2. 封裝組件的步驟3. 封裝組件的原則4. 組件的復用和擴展5. 組件的維護和文檔 三、項目的性能優化你有什…

python數據結構學習系列

在Python編程中&#xff0c;數據結構是組織、管理和存儲數據的方式&#xff0c;以便能夠有效地執行特定的操作。數據結構的選擇對于算法的效率、代碼的清晰度和可維護性都至關重要。以下是對Python中常見數據結構的學習總結。 列表&#xff08;List&#xff09; 列表是Python中…

selenium測試工具用來模擬用戶瀏覽器的操作

執行JS的類庫&#xff1a;execjs&#xff0c;PyV8&#xff0c;selenium&#xff0c;node pip list pip install selenium pip install xlrd pip install xlwt pip install PyExecJS pip install xlutils selenium測試工具可以用來模擬用戶瀏覽器的操作&#xff0c;其支持的瀏覽…

能當老板的AI大模型多智體框架MetaGPT自動完成項目

能當老板的AI大模型多智體框架MetaGPT自動完成項目。 MetaGPT是一個創新的多智能體框架&#xff0c;它結合了大語言模型&#xff08;LLM&#xff09;和多智能體協作系統&#xff0c;旨在通過模擬人類工作流程來解決復雜問題。這個框架的核心在于將標準化操作程序&#xff08;SO…

Redis學習路徑(構建體系)

學習路徑 掌握數據類型&#xff08;分析底層數據結構&#xff09;和緩存的基本使用 (理論使用) 掌握 redis 實現高性能&#xff0c;高可靠、高可用技術 &#xff08;理論&#xff09;學習redis源代碼底層實現 (底層實現) 先來一個引言&#xff0c;比較宏觀的角度&#xf…

Linux常用操作命令

Linux作為一種廣泛應用的操作系統&#xff0c;其強大的命令行工具使得用戶能夠高效地管理文件、處理數據和監控系統。在本文中&#xff0c;我們將深入 探討一些常用的Linux操作命令及其用法。 ls&#xff1a;列出當前目錄下的文件和子目錄。 ls [選項] [文件或目錄]常用選項&am…

Python實現MACD工具判斷信號:股票技術分析的工具系列(1)

Python實現MACD工具判斷信號&#xff1a;股票技術分析的工具系列&#xff08;1&#xff09; 介紹代碼rolling函數介紹核心代碼計算指數移動平均值計算MACD指標 完整代碼 介紹 先看看官方介紹&#xff1a; MACD (平滑異同平均線&#xff09; 指標說明 DIF線&#xff1a;收盤價短…

#單片機(TB6600驅動42步進電機)

1.IDE:keil 2.設備:保密 3.實驗&#xff1a;使用單片機通過普通IO口控制TB6600驅動42步進電機 4.時序圖&#xff1a; TB6600 ENA、ENA-DIR-、DIRPUL-、PULB-、BA、A-VCC、GND使能電機&#xff08;直接懸空不接&#xff09;方向脈沖輸入&#xff08;普通IO口模擬即可&#xff…

Linux系統編程7--線程 寫個測試腳本

Linux系統編程7–線程_寫個測試腳本 參考博客&#xff1a; Linux多線程編程初探 - 峰子_仰望陽光 - 博客園 (cnblogs.com) 我的PC是8核*16進程&#xff0c;所以在固定的時間點&#xff0c;我可以同時運行8 * 16的進程&#xff0c;更多的線程&#xff08;任務管理器&#xff09;…

【學習筆記】Diffusion擴散模型

導讀 Diffusion models是現在人工智能領域最火的方向之一&#xff0c;并引爆了AIGC領域&#xff0c;一大批創業公司隨之誕生。 AIGC&#xff08;AI-Generated Content&#xff09;&#xff1a;人工智能創作內容的生產方式。 擴散模型Diffusion 擴散模型Duffison的訓練過程 …

等概率事件算法

1等概率的生成(0-8)范圍內的正整數 // Math.random 數據范圍[0,1) 且 是 等概率的產生隨機數 // 應用&#xff1a; // 1.生成等概率的整數&#xff08;等概率的生成(0-8)范圍內的正整數 int value (int) (Math.random() * 9); System.out.println("value "…

非阻塞實現高效鍵盤掃描功能(STM32F4XX)

目錄 概述 1 原理分析 1.1 技術背景 1.2 系統硬件 1.3 STM32 IO&#xff08;輸入模式&#xff09;寄存器分析 1.3.1 輸入IO的功能描述 1.3.2 輸入配置 1.3.3 GPIO 寄存器&#xff08;輸入模式相關&#xff09; 1.3.3.1 GPIO 端口模式寄存器 1.3.3.2 GPIO 端口上拉/下拉…

springboot,druid動態數據源切換

關鍵字&#xff1a;springboot&#xff0c;druid數據庫連接池&#xff0c;兩個數據源&#xff08;可以切換成多個&#xff09;&#xff0c;事務管理 關于druid簡介傳送門&#xff1a;https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98 具體分為四…