从地图流创建列表流

时间:2019-06-15 17:22:02

标签: dart stream

我有一个项目,要求我使用流。

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

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

这完全坏了,无法正常工作! :)任何想法如何实现这一目标?

谢谢

1 个答案:

答案 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