Используйте ожидание для прослушивания событий:
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
для ваших исключений, чтобы ваши пользователи могли отловить и обработать их специально, а не перехватывать все исключения).