我有一个方法可以将其输出发送到给定的Sink<Node>中。我想把它导入stdout,也就是Sink<List<int>>。假设我有一个函数convert,它可以将Node转换为List<int>,我如何将stdout转换为Sink<Node>,以便它将我的树打印到控制台?
Sink<Node>
stdout
Sink<List<int>>
convert
Node
List<int>
5gfr0r5j1#
我已经做了这个例子来展示如何使用StreamController来实现这一点:
import 'dart:async'; import 'dart:convert'; import 'dart:io'; class Message { String text; Message(this.text); } void main() { final controller = StreamController<Message>(); stdout.addStream(controller.stream .map((var msg) => msg.text) .transform(const Utf8Encoder())); var messageSink = controller.sink; messageSink.add(Message('Hello World')); }
此示例中的StreamController获取Message对象并将其转换为List<int>,方法是首先使用map将Message转换为String对象,然后使用转换器将String转换为UTF8字节的List。
Message
map
kiayqfof2#
我已提交:https://github.com/dart-lang/sdk/issues/50607下面是我解决这个问题的方法:
class _MappedSink<From, To> implements Sink<From> { final To Function(From) _transform; final Sink<To> _sink; const _MappedSink(this._sink, this._transform); @override void add(From data) => _sink.add(_transform(data)); @override void close() => _sink.close(); } extension SinkMap<To> on Sink<To> { Sink<From> map<From>(To Function(From) transform) => _MappedSink(this, transform); }
2条答案
按热度按时间5gfr0r5j1#
我已经做了这个例子来展示如何使用StreamController来实现这一点:
此示例中的StreamController获取
Message
对象并将其转换为List<int>
,方法是首先使用map
将Message
转换为String对象,然后使用转换器将String转换为UTF8字节的List。kiayqfof2#
我已提交:https://github.com/dart-lang/sdk/issues/50607
下面是我解决这个问题的方法: