Можно ли слушать поток по одному за раз или вообще один раз? - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть StreamController:

StreamController<Workout> _selectedWorkoutSubject = new StreamController()

Я слушаю его в StreamBuilder следующим образом:

StreamBuilder(
  stream: workoutBloc.selectedWorkoutStream,
  builder: (BuildContext context, AsyncSnapshot<Workout> snapshot) {
    if (snapshot.hasData) {
      return ...
    } else {
      return Text('loading...');
    }
  }
);

Когда я покидаю текущую страницу и возвращаюськ этому я получаю Исключение: Bad state: Stream has already been listened to. Я знаю, что могу только один раз за раз, но разве я этим не занимаюсь?Когда я покидаю страницу, StreamBuilder должен получить сборщик мусора, который освобождает поток, чтобы что-то еще могло его прослушать.

Или поток может быть только один раз в общем (не один раз за раз)?Я знаю, что могу просто сделать

StreamController<Workout> _selectedWorkoutSubject = new StreamController.broadcast();

Но я пытаюсь понять, почему это не работает так, как я это делал изначально.

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Это не "по одному".Невещательный поток можно прослушивать только один раз.

В настоящее время я считаю, что использование вещательного потока - ваш лучший выбор.Контроллер вещательного потока получает события onCancel и onListen, когда он перестает иметь слушателей и снова начинает иметь слушателей, поэтому вы можете избежать работы, когда слушателей нет.

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

0 голосов
/ 11 февраля 2019

Попробуйте несколько вещей:

  1. Установите начальные данные построителя потока
  2. Измените StreamController на BehaviorSubject (RxDart lib)

Я думаю, что первый совет поможет вам,

...