【 Flutter 】Flutter を 基礎 から 学習 ( Dart編 ) part39 Dartの特徴

Pocket

基礎 から 学ぶ Flutter 」という書籍で  学習 したことを ブログでアウトプットしていこうと思います。今回は Dart編 ( part39 )です。

前回

【 Flutter 】Flutter を 基礎 から 学習 ( Dart編 ) part38 Dartの特徴

今回は非同期ジェネレータの学習です。

Dartの特徴

非同期ジェネレータ

非同期ジェネレータはその名の通り、非同期で処理が進むジェネレータです。
同期ジェネレータと違うのは以下の部分です。

  • 戻り値の型がStream型となる
  • 同期ジェネレータでsync*と記述していた部分はasync*になる
  • yieldの引数にはFutureクラスを指定する
  • 非同期ジェネレータ内の処理ではawaitを使用する
Stream<int> fetchDoubles(int start, int end) async* {
  for (int i = start; i <= end; i++) {
    yield await fetchDouble(i);
  }
}
Future<int> fetchDouble(int val) {
  // 1秒スリープ、成功したら与えられた値の2倍の値を返します。
  return Future.delayed(Duration(seconds: 1)).then((_) {
    return val * 2;
  });
}

main(){
  print('開始します。');
  
  //fetchDoubles(1, 10).listen((v) => print(v));
  // 以下の実装は、上記の実装と同じです。
  fetchDoubles(1, 10).listen(print);
  
  // どのタイミングで出力されるでしょうか?
  print('終了します。');
}

実行すると以下のように動作します。

実行結果からわかるように「開始します。」の直後に「終了します。」が出力されています。
fetchDoublesの部分が非同期であることがわかりますね。

最後に

再起処理の場合、同期ジェネレータ同様にyield*キーワードを使えばよいようです。

今日はここまで!