Dart StreamクラスのeventTransformedコンストラクタについてメモ書き。
eventTransformedは受け取ったStreamイベントを加工して出力するコンストラクタ。
第1引数で生成元のStreamを渡し、第2引数でEventSink<T>クラスを渡す。
Sinkはデータの受け皿でパイプの役割を果たす。EventSinkは非同期用のイベントを処理する時に使用する。
EventSinkは抽象クラスなので、implementsで実装する必要がある。
EventSinkはdart:asyncライブラリに含まれている。FutureやStreamと違ってdart:coreで読み込まれていないため、実装時にimportする。
EventSinkでは実装時に以下3つのメソッドをオーバーライドする。
| メソッド | 説明 | 
|---|---|
| add() | 受け取ったデータを加工してSinkに追加する。 | 
| addError() | エラーをSinkに追加する。 | 
| close() | Sinkを閉じる。 | 
それではコーディングで動作を確認。
以下の例ではStreamで受け取った数値を2倍に加工し、リスナーに渡している。
import 'dart:async';
// EventSink<T>クラスを実装したMyEventSinkクラスを作成。
class MyEventSink implements EventSink<int> {
  final EventSink<int> _outputSink;
  MyEventSink(this._outputSink);
  // データを加工してSinkに追加。
  void add(int data) {
    _outputSink.add(data * 2);
  }
  // エラー出力をSinkに追加。
  void addError(Object error, [StackTrace? stackTrace]) {
    _outputSink.addError(error, stackTrace);
  }
  // Sinkを閉じる。
  void close() {
    _outputSink.close();
  }
}
void main() {
  // 生成元のStreamを作成。
  final sourceStream = Stream.fromIterable([1, 2, 3, 4, 5]);
  // eventTransformedを定義。
  final transformedStream = Stream.eventTransformed(
    sourceStream,
    (EventSink<int> sink) => MyEventSink(sink),
  );
  // 加工されたStreamをリッスンする。
  transformedStream.listen(print); 
}(EventSink<int> sink) => MyEventSink(sink)でsourceStreamのデータをMyEventSinkクラスが受け取っている。MyEventSinkクラスに渡されたデータをadd()メソッドは引数として受け取り、数値を2倍に加工した後リスナーに渡している。
実行結果。[1, 2, 3, 4, 5]が2倍になって出力されている。パイプとして機能した事が分かる。
2
4
6
8
10

コメント