Flutter- Streams的異步編程

部分代碼的單獨(dú)工作流程

異步編程是一種原則,允許您的程序的一部分在等待應(yīng)用程序線程中發(fā)生的其他活動(dòng)時(shí)運(yùn)行疲陕。它允許您的部分代碼獨(dú)立于主工作流程運(yùn)行禽最。

異步過(guò)程的幾個(gè)例子是:從網(wǎng)絡(luò)獲取數(shù)據(jù)泉坐,或循環(huán)一些非常大的數(shù)據(jù)塊。

在Flutter中有一系列編寫(xiě)異步代碼的方法净宵。一些流行的方法是:

  • Future
  • Async/Await
  • Streams

這篇文章的目的是讓你開(kāi)始在你的flutter應(yīng)用程序中使用流,我希望你有關(guān)于編寫(xiě)flutter應(yīng)用程序的先驗(yàn)知識(shí)裹纳,讓我們開(kāi)始吧择葡!


什么是反應(yīng)式編程?

根據(jù)維基百科

反應(yīng)式編程是一種圍繞數(shù)據(jù)流和變化傳播的編程范例剃氧。這意味著應(yīng)該可以在所使用的編程語(yǔ)言中輕松表達(dá)靜態(tài)或動(dòng)態(tài)數(shù)據(jù)流敏储,并且底層執(zhí)行模型將自動(dòng)通過(guò)數(shù)據(jù)流傳播更改。

在反應(yīng)式編程中朋鞍,數(shù)據(jù)在由您使用的語(yǔ)言已添,框架或庫(kù)設(shè)置的結(jié)構(gòu)中流動(dòng)妥箕,使得當(dāng)數(shù)據(jù)在一端傳遞到結(jié)構(gòu)中時(shí),如果該數(shù)據(jù)的值發(fā)生更改更舞,則輸出將始終自行更新畦幢。

這正是Steams所做的。流是異步事件流缆蝉,將其視為包含液體的管道宇葱。你從管道的一端倒出液體,它從另一端出來(lái)刊头。

流可以攜帶和處理不同類(lèi)型的數(shù)據(jù)黍瞧,如對(duì)象,函數(shù)芽偏,映射雷逆,列表,甚至流的流污尉。太酷了呃膀哲?


代碼示例

第一個(gè)示例創(chuàng)建一個(gè)簡(jiǎn)單的流,它接收一個(gè)字符串并在完成后將其打印出來(lái):

@override
void initState() {
super.initState();
Stream<String> stream = new Stream.fromFuture(inputData());
stream.listen((data) {
print("Our data: " + data);
}, onDone: () {
print("Done");
}, onError: (error) {
print("Error returned");
});
}
Future<String> inputData() async {
print("Fetching Data...");
return "Let's Use Streams!";
}

輸出

Fetching Data…
Our Data: Let’s use Streams!
Done

這里被碗,Stream從inputData()返回文本的函數(shù)中獲取數(shù)據(jù)“Let’s use streams!”某宪。然后,我們用stream.listen()對(duì)輸入流中的數(shù)據(jù)锐朴。在這里兴喂,我們有一個(gè)和方法焚志。在進(jìn)程完成時(shí)使用數(shù)據(jù)衣迷,如果有的話可以用來(lái)拋出錯(cuò)誤。onDone()``onError()``onDone()``onError()


第二個(gè)例子

final StreamController controller= StreamController();
controller.stream.listen((data) {
print("received data: $data");
}, onDone: () {
print("Stream done");
}, onError: () {
print("Error occured");
});
// data flowing into the stream
controller.sink.add('stream controllers are awesome');
controller.sink.add("Because You can do more");
controller.sink.add('random string');
// Close the StreamController when done to avoid memory leaks
controller.close();

輸出

received data: stream controllers are awesome
received data: Because you can do more
received data: random string
Stream done

所述StreamController類(lèi)創(chuàng)建為創(chuàng)建的任何流的控制器酱酬。讓您更容易使用多個(gè)監(jiān)聽(tīng)(我們很快就會(huì)開(kāi)始)壶谒。這里我們使用添加數(shù)據(jù)[sink](https://api.flutter.dev/flutter/dart-async/StreamSink-class.html).add()這是一個(gè)接受輸入到流中的數(shù)據(jù)的對(duì)象膳沽。此外汗菜,您應(yīng)該在使用后關(guān)閉控制器,以防止內(nèi)存泄漏挑社。


廣播流

這種類(lèi)型的流允許您使用多個(gè)偵聽(tīng)器陨界。我們之前創(chuàng)建的流只能有一個(gè)監(jiān)聽(tīng)器; 它們被稱(chēng)為單訂閱流。

代碼示例

@override
void initState() {
super.initState();
stream();
}
final StreamController controller = StreamController.broadcast(); //add a .broadcast() 
stream() {
controller.stream.where((data) => (data is String)).listen((data) {
print("DataReceived: " + data);
}, onDone: () {
print("Task 1 Done");
}, onError: (error) {
print("Some Error");
});
controller.stream.where((data) => (data is int)).listen((data) {
print("DataReceived: " + data.toString());
}, onDone: () {
print("Task 2 Done");
});
controller.stream.where((data) => (data is Map)).listen((data) {
print(data);
}, onDone: () {
print("Task 3 Done");
});
controller.sink.add('random string');
controller.sink.add(1234);
controller.sink.add({'key 1': 'value A', 'key 2': 'value B'});
controller.close();
}

輸出

DataReceived: random string
DataReceived: 1234
{key 1: value A, key 2: value B}
Task 1 Done
Task 2 Done
Task 3 Done

在這里痛阻,我們初始化一個(gè)StreamController帶有.broadcast()那么菌瘪,我們監(jiān)聽(tīng)流三個(gè)不同的時(shí)間。請(qǐng)注意阱当,我們.where()在偵聽(tīng)之前使用了一個(gè)方法麻车,這有助于我只監(jiān)聽(tīng)滿足給定條件的流中的數(shù)據(jù)缀皱。首先,我們只打印字符串动猬,然后是整數(shù)啤斗,然后是地圖。

現(xiàn)在您知道如何創(chuàng)建和使用流赁咙。我將寫(xiě)一篇單獨(dú)的文章钮莲,我們可以使用流在我們的屏幕上使用實(shí)際工作應(yīng)用程序繪制小部件!

翻譯自:https://medium.com/better-programming/async-programming-in-flutter-with-streams-c949f74c9cf9

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末彼水,一起剝皮案震驚了整個(gè)濱河市崔拥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌凤覆,老刑警劉巖链瓦,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異盯桦,居然都是意外死亡慈俯,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)拥峦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)贴膘,“玉大人,你說(shuō)我怎么就攤上這事略号⌒滔浚” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵玄柠,是天一觀的道長(zhǎng)突梦。 經(jīng)常有香客問(wèn)我,道長(zhǎng)羽利,這世上最難降的妖魔是什么宫患? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮铐伴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘俏讹。我一直安慰自己当宴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布泽疆。 她就那樣靜靜地躺著户矢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪殉疼。 梳的紋絲不亂的頭發(fā)上梯浪,一...
    開(kāi)封第一講書(shū)人閱讀 51,208評(píng)論 1 299
  • 那天捌年,我揣著相機(jī)與錄音,去河邊找鬼挂洛。 笑死礼预,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的虏劲。 我是一名探鬼主播托酸,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼柒巫!你這毒婦竟也來(lái)了励堡?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤堡掏,失蹤者是張志新(化名)和其女友劉穎应结,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體泉唁,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鹅龄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了游两。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砾层。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖贱案,靈堂內(nèi)的尸體忽然破棺而出肛炮,到底是詐尸還是另有隱情,我是刑警寧澤宝踪,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布侨糟,位于F島的核電站,受9級(jí)特大地震影響瘩燥,放射性物質(zhì)發(fā)生泄漏秕重。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一厉膀、第九天 我趴在偏房一處隱蔽的房頂上張望溶耘。 院中可真熱鬧,春花似錦服鹅、人聲如沸凳兵。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)庐扫。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間形庭,已是汗流浹背铅辞。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留萨醒,地道東北人斟珊。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像验靡,于是被迫代替她去往敵國(guó)和親倍宾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容