DEV Community

kaede
kaede

Posted on

Dart Stream の使い方

Stream とは?

https://dart.dev/tutorials/language/streams

公式サイトにはこう書いてある。

  • 非同期の一連の実行
  • await forlisten() を使うことで Stream を使える
  • Error も出せる
  • 単一契約と放送の 2 種類の Stream がある。

サンプルをうごかしてみる

Future<int> sumStream(Stream<int> stream) async {
  var sum = 0;
  await for (final value in stream) {
    sum += value;
  }
  return sum;
}
Enter fullscreen mode Exit fullscreen mode

Future (関数の型?) で steam の中身を足し続ける?
関数をmain から実行してみると

void main() async {
  sumStream(10)
}
Enter fullscreen mode Exit fullscreen mode
Error: The argument type 'int' can't be assigned to the parameter type 'Stream<int>'.
 - 'Stream' is from 'dart:async'.
  sumStream(10)
            ^
Error: Compilation failed.
Enter fullscreen mode Exit fullscreen mode

stream でないと受け付けないと出る。

TS のように型さえつければよいのかと
Stream + int 型をつけて
それを引数に渡して実行してみる

  var: Stream<int> number = 10;
Enter fullscreen mode Exit fullscreen mode

しかし、Stream 型で 変数を定義することはできなかった。


StreamController を作ってみる

https://qiita.com/JunichiHashimoto/items/7ca7ec6cd2c9af0714eb

調べると、StreamController を使って変数を作り
その中に sink で中身を入れて
stream で中身を取り出すらしい。

import 'dart:async';

main() {
  final controller = StreamController();
  controller.sink.add(1);
  controller.sink.add(2);
  controller.sink.add("Tidus");


  controller.stream.listen((value){
    print(value);
  });
}
Enter fullscreen mode Exit fullscreen mode
1
2
Tidus
Enter fullscreen mode Exit fullscreen mode

DartPad で動作確認ができた。

dart:async を import することで
StreamController は使えるようになって

これは Stream なので、変数なのにドンドン追加することができて
型は何でも入るらしい。

そして、steam.listen すると入れた順番で出力してくれる。
このように解釈できた。

非同期関数処理をみてみる

https://qiita.com/JunichiHashimoto/items/7ca7ec6cd2c9af0714eb#stream%E3%82%92%E8%BF%94%E3%81%99%E9%96%A2%E6%95%B0%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%99%E3%82%8B

同じ記事で非同期関数処理の説明をみると

関数に async* をつけると普通の int で取った引数を返り値として Stream に変更できて

無印の async をつけると Stream で受けとった引数を Feature の返り値として扱える

と解釈できる。


まとめ

StreamController を使えばなんでも入る Stream の変数をつくれる。

Stream の変数には sink で追加できる

Stream の変数に listen を打つと中身を全て吐き出す

非同期で Stream を受け取る Future 関数を async で作ると、普通の int や string の変数を渡しても動かない。

int や string の変数を Stream に変換する Future 関数を async* で作ると int や string で受け取って Stream に変換できる中間パイプの注ぎ口が作れる。

Top comments (0)