DartでStreamTransformerを作成するには?質問する

DartでStreamTransformerを作成するには?質問する

カスタム StreamTransformer クラスを構築しようとしていますが、そこにある例の多くは古くなっているようで、ドキュメントにある例はクラスではありません (一部の型付き言語ではクラスと見なされる場合があります) (ここにあります:https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart:async.StreamTransformer)。これは Dart のようなアプローチ方法ではなく、むしろ JavaScript のような方法 (これを避けるために Dart を使用しています) のように思えます。

多くのオンラインソースでは、これが StreamTransformer を作成する方法であると説明されていますが、拡張するとエラーが発生します。

class exampleStreamTransformer extends StreamTransformer
{
  //... (This won't work)
}

必要なバインド関数を実装するとともに、「実装」するのが最善の方法のようです。

class exampleStreamTransformer implements StreamTransformer
{
  Stream bind(Stream stream)
  {
    //... (Go on to return new stream, etc)
  }
}

この方法の例は見つからないようですが、自分で何かをまとめてみました (これは IDE では受け入れられますが、実行時には受け入れられず、pause getter を使用しようとすると null オブジェクト エラーが発生します)。

class exampleStreamTransformer implements StreamTransformer
{
  StreamController<String> _controller;
  StreamSubscription<String> _subscription;

  Stream bind(Stream stream)
  {
    _controller = new StreamController<String>(
        onListen: ()
        {
          _subscription = stream.listen((data)
          {
            // Transform the data.
            _controller.add(data);
          },
          onError: _controller.addError,
          onDone: _controller.close,
          cancelOnError: true); // Unsure how I'd pass this in?????
        },
        onPause: _subscription.pause,
        onResume: _subscription.resume,
        onCancel: _subscription.cancel,
        sync: true
    );

    return _controller.stream;
  }
}

クラスを生成する「型付けされた」方法でこれを実現したいのですが、どんな助けでも大歓迎です、ありがとうございます。

ベストアンサー1

以下を使用してみませんかStreamTransformer.fromHandler():

import 'dart:async';

void handleData(data, EventSink sink) {
  sink.add(data*2);
}

void main() {
  StreamTransformer doubleTransformer = new StreamTransformer.fromHandlers(handleData: handleData);

  StreamController controller = new StreamController();
  controller.stream.transform(doubleTransformer).listen((data) {
    print('data: $data');
  });

  controller.add(1);
  controller.add(2);
  controller.add(3);
}

出力:

data: 2
data: 4
data: 6

おすすめ記事