Создать поток из другого результата потока - PullRequest
0 голосов
/ 26 марта 2020

У меня есть поток, который я хочу отобразить результат этого потока в другой поток и вернуть сопоставленный поток.

Stream<SomeClass> subscribe() async* {
    final Stream<Map<String, dynamic>> baseStream = api.subscribeToSomething(id: id);

    baseStream.listen(
      (Map<String, dynamic> response) {
        if (response.containsKey('error')) {
          throw Exception(response['error']['message']);
        } else {
          yield SomeClass.fromMap(response['result']);
        }
      },
    );
}

но я получаю эту ошибку:

Метод yield не определен для класса SomeClass. Попробуйте исправить имя с именем существующего метода или определить метод с именем yield.

Вопрос в том, как сопоставить поток другому потоку и вернуть поток результатов?

Ответы [ 2 ]

3 голосов
/ 26 марта 2020

Благодаря julemand101 , решение:

 Stream<SomeClass> subscribe() => 
    api.subscribeToSomething(id: id).map<SomeClass>(
        (Map<String, dynamic> response) {
          if (response.containsKey('error')) {
            throw Exception(response['error']['message']);
          } else {
            return SomeClass.fromMap(response['result']);
          }
        },
      );
2 голосов
/ 26 марта 2020

Используйте ожидание для прослушивания событий:

  Stream<SomeClass> subscribe() async* {
    final Stream<Map<String, dynamic>> baseStream = api.subscribeToSomething(id: id);

    await for (var response in baseStream) {
      if (response.containsKey('error')) {
        throw Exception(response['error']['message']);
      } else {
        yield SomeClass.fromMap(response['result']);
      }
    }
  }

. await for будет правильно пересылать паузы и возобновлять работу в базовый поток, а ошибки в базовом потоке завершают l oop.

(Кроме того, рассмотрите возможность создания подкласса Exception для ваших исключений, чтобы ваши пользователи могли отловить и обработать их специально, а не перехватывать все исключения).

...