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;
      });
}

有了这个类,我只需要扩展 fromTransformer以适应变化。

但是当我扩展它时:

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);

这将分配 aTransformer而不是子类。

最简单的解决方案:不要分配新的水槽,而是重复使用你已有的水槽:

  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 回答