如何映射/"resink"流控制器的输入端



>假设我有一个名为myControllerStreamController<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();
}

最新更新