Flutter: исключение при попытке прослушать трансляцию дважды - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть хранилище, которое содержит широковещательный поток

 Stream<List<DeliveryModel>> get deliveriesStream {
    this._getDeliveries();
    return this._controller.stream.asBroadcastStream();
  }

и у меня есть два подписчика, как только я начинаю слушать вручную,

var stream = this._deliveryRepo.deliveriesStream;
    deliveriesSubscription = stream.listen((deliveries) {
    // to do something 
});

и один раз через StreamBuilder

@override
  void initState() {
    super.initState();
    this.stream = this.widget.deliveriesFetcher.getDeliveriesStream();
  }

  @override
  Widget build(BuildContext context) {
    return StreamBuilder(
        stream: this.stream,
        builder: (context, snapshot) {
          // do something
        });
  }

где

@override
  Stream<List<DeliveryModel>> getDeliveriesStream() {
    return this._deliveryRepo.deliveriesStream;
  }

Если я правильно понял, я подписываюсь на широковещательный поток дважды, поэтому все должно быть хорошо, но когда я пытаюсь подписаться на поток для во второй раз (через StreamBuilder ) выдается исключение: Плохое состояние: поток уже прослушан. Есть предложения?

1 Ответ

0 голосов
/ 12 апреля 2020

Причина в том, что вы создаете новый BroadcastStream каждый раз, когда вызывается геттер deliveriesStream. Попробуйте использовать что-то вроде этого:

Stream<List<DeliveryModel>> _deliveriesStream;

Stream<List<DeliveryModel>> get deliveriesStream {
  this._getDeliveries();
  _deliveriesStream ??= _controller.stream.asBroadcastStream();
  return _deliveriesStream;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...