Есть ли способ создать широковещательный поток с синтаксисом async* [Dart]

#dart

Вопрос:

Беря этот пример из документов Dart. Есть ли способ timedCounter() вернуть широковещательный поток по определению?

 Stream<int> timedCounter(Duration interval, [int? maxCount]) async* {
  int i = 0;
  while (true) {
    await Future.delayed(interval);
    yield i  ;
    if (i == maxCount) break;
  }
}
 

Не ищу timedCounter().asBroadcastStream() ни с помощью а StreamController .
Этот вопрос больше касается того, является ли синтаксис определения функции async* ограничивающим поток результатов одной подпиской.

Ответ №1:

Нет.

Stream Созданный async* функцией поток всегда является потоком с одной подпиской. Если вам нужен широковещательный поток, либо используйте .asBroadcastStream() , либо, предпочтительно, используйте контроллер широковещательного потока напрямую.

async* Функция предназначена для нормального выполнения до тех пор, пока она не будет выполнена, управляемая обычным потоком управления одной (асинхронной) функцией.

Широковещательные потоки обычно используются для запуска событий в ответ на другие происходящие события. Хотя вы можете сделать что-то подобное с помощью async* функции, на самом деле очень легко ошибиться (например, не поймать ошибку и завершить поток до того, как вы это сделаете). Так что, по крайней мере на данный момент, async* потоки являются одноподписными. (Если бы я мог это изменить, я бы сделал их многопользовательскими, как конструктор, где каждое прослушивание получает свою собственную последовательность событий, начиная с нуля, а не широковещательный Stream.multi поток, в котором слушатели разделяют одни и те же события).