首页 > 解决方案 > 从地图流创建列表流

问题描述

我有一个项目需要我使用流。

我有一个带有以下代码的地图流:

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();

这完全坏了,不起作用!:) 任何想法如何实现这一目标?

谢谢你

标签: dartstream

解决方案


您可以使用 a 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到新的地图StreamList<String>

一个实际的例子:

void main() {
  phoneNumbers.listen((s) => print(s));

  streamController.sink.add({
    '1': 'a',
    '2': 'b',
    '3': 'c',
  });
}

安慰:

[1、2、3]

在这里查看它的实际应用。


推荐阅读