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
コメント