我有一个项目,要求我使用流。
我有一个带有以下代码的地图流:
Stream<Map<String,TextBlock>> get phoneNumberBlocks =>
visionMatch.map((MatchVisionTextRegex ourRegexDetection) {
final Map<String,TextBlock> list = <String,TextBlock>{};
for (MatchVisionTextData textData in ourRegexDetection.phone) {
list[textData.parsedText]=textData.textBlock;
}
return list;
}).asBroadcastStream();
现在我想创建另一个流,该流采用地图的phoneNumberBlocks
流,并返回该映射键列表的另一个流。
到目前为止,我有这个:
Stream<List<String>> get phoneNumbers =>
phoneNumberBlocks.map<String,TextBlock>((String s, TextBlock b) =>
s).asBroadcastStream();
这完全坏了,无法正常工作! :)任何想法如何实现这一目标?
谢谢
答案 0 :(得分:1)
您可以使用StreamTransformer
,因为它的目的是接收流,对其进行转换并返回一个新流。
给定Stream
中的Map<String,String>
:
StreamController<Map<String,String>> streamController = StreamController.broadcast();
Stream<Map<String,String>> get phoneNumberBlocks => streamController.stream;
您可以这样创建一个新的
:Stream<List<String>> get phoneNumbers => phoneNumberBlocks.transform(StreamTransformer.fromHandlers(
handleData: (Map<String,String> data, sink) {
sink.add(data.keys.toList());
}
));
StreamTransformer
将接收来自phoneNumberBlocks
的数据,并将地图中的keys
仅添加到Stream
的新List<String>
中。
一个实际例子:
void main() {
phoneNumbers.listen((s) => print(s));
streamController.sink.add({
'1': 'a',
'2': 'b',
'3': 'c',
});
}
控制台:
[1、2、3]
查看实际情况here。