Как вернуть поток в Dart, не просматривая его

#dart #dart-stream

#дротик #поток #уступка

Вопрос:

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

Этот код работает:

 Stream<int> returnStream2() async* {
  var list = <int>[1,2,3];
  var result = Stream<int>.fromIterable(list);
  await for( var i in result ) {
    yield i;
  }
}
 

Почему эта более простая и понятная версия не работает?

 Stream<int> returnStream1() async* {
  var list = <int>[1,2,3];
  var result = Stream<int>.fromIterable(list);
  return resu<
}
 

Я получаю сообщение об ошибке «Не удается вернуть значение из функции генератора (с использованием модификатора ‘async *’)

Ответ №1:

Либо используйте yield* , как вы уже обнаружили, либо просто не делайте функцию async* функцией. Если этот поток — единственное, что вы получаете, вы можете просто сделать:

 Stream<int> returnStream1() {
  var list = <int>[1,2,3];
  var result = Stream<int>.fromIterable(list);
  return resu<
}
 

Если вы делаете другие вещи, то yield* stream; или await for (var event in stream) yield event; являются обоими вариантами (они отличаются тем, как они обрабатывают события ошибок из потока, но для простых событий данных они должны быть эквивалентны).

Комментарии:

1. Спасибо, в этом есть смысл

Ответ №2:

Я только что обнаружил ключевое слово yield *, которое решает мою проблему:

 Stream<int> returnStream1() async* {
  var list = <int>[1,2,3];
  var result = Stream<int>.fromIterable(list);
  yield* resu<
}