在 Dart 中使用 Sink 和 Pipe with Streams 有什么区别?

What is the difference between using Sink and Pipe with Streams in Dart?

import "dart:async";
import "dart:html";

void main() async {
  InputElement addStream = querySelector("#addstream");

  Stream<int> aStream = _someStream();
  StreamController<int> sc = StreamController();

  sc.stream.listen((e) => print(e));

  addStream.onClick.listen((e) {
  sc.sink.addStream(aStream);  // streamcontroller brings in stream through the sink
  // aStream.pipe(sc);   // stream going into streamcontroller through the sink
  });
}

上面的代码中,sc.sink.addStream(aStream)好像是用sink的方法把aStream加到StreamControllersc上。 在此之下,aStream 使用 pipe 添加到 StreamController sc

这两种方法似乎做同样的事情。在我看来,使用一种方法而不是另一种方法只是一种风格。如果你用的是Streampipe就改成StreamController。如果您正在使用 StreamController,请将 Stream 沉入其中。使用其中一个与另一个相比是否有特殊原因?

aStream.pipe(sc) 将在流结束后 close() 流控制器。使用 sc.addStream(aStream) 流完成后控制器仍将打开,因此您可以添加更多事件或其他流。

在这种情况下对 Stream.pipe 的调用与 sc.addStream(aStream).then((_) sc.close());

相同