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 调用返回的转换流时,将会监听源流,并为源流的每个事件调用处理函数。

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

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

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

当源流关闭时,将调用 handleDone 处理函数,如通过发送完成事件所信号。完成处理函数不带事件值,但在调用 EventSink.close 之前仍可以发送其他事件。如果省略了 handleDone,则源流的完成事件将关闭转换流。

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

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

以此方式创建的转换器应该是 无状态的。它们在处理函数调用之间不应保留状态,因为相同的转换器(因此是相同的手柄)可以用于多个流,或者可以多次监听的流。要创建每个流的处理程序,可以使用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>;