>假设我有一个名为myController
的StreamController<int>
。我知道我可以通过执行类似Stream<int> intStream = myController.map((i) => i * 2)
的操作来映射流的输出,然后收听它。
但是,如果我想拦截/映射接收器的输入,我将如何实现呢?有这方面的 API 吗?为了清楚起见,请看一下这个假的不工作示例:Sink<bool> boolSink = myController.sink.resink<int>((bool b) => b ? 1 : 0)
。因此,映射采用布尔值的接收器并将其转换为整数接收器。然后我会做boolSink.add(true)
并期望intStream
发出1
.
我的目标是为一些组件提供简化的接收器(Sink<void>
(,但不必将它们特定值放入接收器中(因为它们每个只会添加一个预定义的值(。理想情况下,不必自己管理多个StreamControllers
。
我的解决方案是拥有一个实现Sink
接口的类。它截获对add
方法的调用,将要添加的值映射到新值,然后将其转发到"真实"接收器。对于每种类型的映射,我需要一个新的类实例。
import 'package:meta/meta.dart';
typedef Mapper<T, R> = R Function(T);
/// A [Sink] which takes a value of type [T] and maps it to a destination sink
/// which expects a value of type [R].
class SinkMapper<T, R> implements Sink<T> {
final Mapper<T, R> _mapper;
final Sink<R> _sink;
SinkMapper({
@required Mapper<T, R> mapper,
@required Sink<R> sink,
}) : _mapper = mapper,
_sink = sink;
@override
void add(T data) => _sink.add(_mapper(data));
@override
void close() => _sink.close();
}