StreamTransformer<S, T>.fromHandlers 构造函数
- void handleData(
- S data,
- EventSink<
T> sink
- void handleError(
- Object error,
- StackTrace stackTrace,
- EventSink<
T> sink
- void handleDone(
- EventSink<
T> sink
- EventSink<
创建一个将事件委派给给定函数的 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>;