StreamTransformer<S, T>.fromHandlers 构造函数

StreamTransformer<S, T>.fromHandlers({
  1. void handleData(
    1. S data,
    2. EventSink<T> sink
    )?,
  2. void handleError(
    1. Object error,
    2. StackTrace stackTrace,
    3. EventSink<T> sink
    )?,
  3. void handleDone(
    1. EventSink<T> sink
    )?,
})

创建一个将事件委派给给定函数的 StreamTransformer

重复转换器示例的使用

stringStream.transform(StreamTransformer<String, String>.fromHandlers(
    handleData: (String value, EventSink<String> sink) {
      sink.add(value);
      sink.add(value);  // Duplicate the incoming events.
    }));

当监听从 bind 调用返回的转换流时,会监听源流,并为源流的每个事件调用处理函数。

处理函数使用事件数据和可以用于在转换流上发出事件的 sink 来调用。

对于源流的数据事件,将调用 handleData 处理器。如果省略了 handleData,则数据事件将直接添加到创建的流中,就像在 sink 上调用 EventSink.add 一样。如果省略了 handleData,则源流事件类型 S 必须是转换流事件类型 T 的子类型。

对于源流的每个错误,将调用 handleError 处理器。如果省略了 handleError,则错误将直接转发到转换流,就像使用错误和堆栈跟踪调用 EventSink.addError 一样。

当源流关闭时,将调用 handleDone 处理器,这是通过发送完成事件来指示的。完成处理器不取事件值,但可以在调用 EventSink.close 之前发送其他事件。如果省略了 handleDone,则源流的完成事件将关闭转换流。

如果任何处理器在提供的 sink 上调用 EventSink.close,则转换 sink 将关闭,并且将取消源流订阅。该处理器不能向 sink 添加更多事件,并且不会发生更多源流事件。

提供给事件处理器的 sink 必须仅在调用该处理器期间使用。它不得在稍后时间存储和使用。

以这种方式创建的变压器应该是无状态的。它们在处理程序调用之间不应保留状态,因为同一个变压器(因此是同一个处理程序)可能用于多个流,或者可以多次监听的流。为了创建每个流的处理程序,可以使用 StreamTransformer.fromBind 来为每个流创建一个新的 StreamTransformer.fromHandlers 进行转换。

var controller = StreamController<String>.broadcast();
controller.onListen = () {
  scheduleMicrotask(() {
    controller.addError("Bad");
    controller.addError("Worse");
    controller.addError("Worst");
  });
};
var sharedState = 0;
var transformedStream = controller.stream.transform(
    StreamTransformer<String>.fromHandlers(
        handleError: (error, stackTrace, sink) {
  sharedState++; // Increment shared error-counter.
  sink.add("Error $sharedState: $error");
}));

transformedStream.listen(print);
transformedStream.listen(print); // Listen twice.
// Listening twice to the same stream makes the transformer share the same
// state. Instead of having "Error 1: Bad", "Error 2: Worse",
// "Error 3: Worst" as output (each twice for the separate subscriptions),
// this program emits:
// Error 1: Bad
// Error 2: Bad
// Error 3: Worse
// Error 4: Worse
// Error 5: Worst
// Error 6: Worst

实现

factory StreamTransformer.fromHandlers(
    {void handleData(S data, EventSink<T> sink)?,
    void handleError(Object error, StackTrace stackTrace, EventSink<T> sink)?,
    void handleDone(EventSink<T> sink)?}) = _StreamHandlerTransformer<S, T>;