日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

dart系列之:在dart中使用生成器

發布時間:2024/2/28 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 dart系列之:在dart中使用生成器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 簡介
  • 兩種返回類型的generator
  • Stream的操作
  • 總結

簡介

ES6中在引入異步編程的同時,也引入了Generators,通過yield關鍵詞來生成對應的數據。同樣的dart也有yield關鍵詞和生成器的概念。

什么時候生成器呢?所謂生成器就是一個能夠持續產生某些數據的裝置,也叫做generator。

兩種返回類型的generator

根據是同步生成還是異步生成,dart返回的結果也是不同的。

如果是同步返回,那么返回的是一個Iterable對象.

如果是異步返回,那么返回的是一個Stream對象。

同步的generator使用sync*關鍵詞如下:

Iterable<int> naturalsTo(int n) sync* {int k = 0;while (k < n) yield k++; }

異步的generator使用的是async* 關鍵詞如下:

Stream<int> asynchronousNaturalsTo(int n) async* {int k = 0;while (k < n) yield k++; }

生成關鍵詞使用的是yield。

如果yield后面跟著的本身就是一個generator,那么需要使用yield*。

Iterable<int> naturalsDownFrom(int n) sync* {if (n > 0) {yield n;yield* naturalsDownFrom(n - 1);} }

Stream的操作

stream表示的是流,得到這個流之后,我們需要從流中取出對應的數據。

從Stream中取出數據有兩種方式,第一種就是使用Stream本身的API來獲取Stream中的數據。

最簡單的就是調用stream的listen方法:

StreamSubscription<T> listen(void onData(T event)?,{Function? onError, void onDone()?, bool? cancelOnError});

listen可以接數據的處理方法,具體使用如下:

final startingDir = Directory(searchPath);startingDir.list().listen((entity) {if (entity is File) {searchFile(entity, searchTerms);}});

默認的方法是onData方法。

另外一種就是今天要講解的await for.

await for的語法如下:

await for (varOrType identifier in expression) {// Executes each time the stream emits a value. }

要注意的是上面的expression必須是一個Stream對象。并且await for必須用在async中,如下:

Future<void> main() async {// ...await for (final request in requestServer) {handleRequest(request);}// ... }

如果要想中斷對stream的監聽,則可以使用break或者return。

總結

以上就是dart中生成器的使用了。

本文已收錄于 http://www.flydean.com/13-dart-generators/

最通俗的解讀,最深刻的干貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!

歡迎關注我的公眾號:「程序那些事」,懂技術,更懂你!

總結

以上是生活随笔為你收集整理的dart系列之:在dart中使用生成器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。