создать поток списка из потока карты - PullRequest
1 голос
/ 15 июня 2019

У меня есть проект, который требует от меня работы с потоками.

У меня есть поток карты со следующим кодом:

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 Ответ

1 голос
/ 15 июня 2019

Вы можете использовать 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]

Смотрите это в действии здесь .

...