1

への変更に伴い、 のStreamEventTransformerように動作するラッパー クラスを作成する必要がある StreamEventTransformerため、コードは次のとおりです。

class Transformer implements EventSink, StreamTransformer {
  EventSink rootSink;

  Transformer();
  Transformer._useSink(this.rootSink);

  void handleData(event, EventSink sink) {
    print('inside handleData');
    sink.add(event);
  }

  void handleError(error, StackTrace stackTrace, EventSink sink) =>
      sink.addError(error, stackTrace);

  void add(event) {
    print('inside add');
    handleData(event, rootSink);
  }


  void addError(error, [StackTrace stackTrace]) =>
      handleError(error, stackTrace, rootSink);

  void close() => rootSink.close();

  Stream bind(Stream source) =>
      new Stream.eventTransformed(source, (EventSink sink) {
        EventSink eventSink = new Transformer._useSink(sink);
        return eventSink;
      });
}

このクラスではTransformer、変更に適応するために拡張する必要があります。

しかし、私がそれを拡張すると:

class PlusOneTransformer extends Transformer {
  void handleData(data, sink) {
    sink.add(data + 1);
  }
}

そしてそれをテストします:

void main() {
  StreamController controller = new StreamController();
  Stream stream = controller.stream.transform(new PlusOneTransformer());
  stream.listen(print);
  controller.add(10);
}

私は出力が次のようになることを期待しています:

inside add
11

代わりに:

inside add
inside handleData
10

したがって、オーバーライドされた を実行しているのではなくhandleData、古いものを実行しています。デバッガーから、実行されたクラスがストリームの変換に使用されている間ではTransformerないことがわかります。PlusOneTransformerPlusOneTransformer

何か不足していますか?

4

1 に答える 1

3

エラーは次の行にあります。

 new Transformer._useSink(sink);

Transformerこれにより、サブクラスではなくa が割り当てられます。

最も簡単な解決策: 新しいシンクを割り当てずに、既にあるものを再利用します。

  Stream bind(Stream source) =>
      new Stream.eventTransformed(source, (EventSink sink) {
        this.rootSink = sink;
        return this;
      });

トランスフォーマーは再利用できないため、これを確認することをお勧めします。

  Stream bind(Stream source) =>
      new Stream.eventTransformed(source, (EventSink sink) {
        if (this.rootSink != null) {
          throw new StateError("Transformer already used");
        }
        this.rootSink = sink;
        return this;
      });
于 2013-10-23T21:01:00.940 に答える