Flutter StatefulWidget - где лучше всего добавить слушателя в поток BLO C - PullRequest
0 голосов
/ 10 марта 2020

У меня есть следующий вариант использования:

У меня есть два StatefullWidget (назовем тогда A и B), каждый внутри TabBarView. Каждый виджет имеет методы initState и dispose. Когда я переключаюсь между вкладками, все выглядит хорошо - например, когда я переключаюсь с A на B, сначала у меня вызывается B:initState(), а затем A:dispose(). Все вроде так и должно быть. В виджете B у меня есть подписка на поток BLOC. BLO C является глобальным, следовательно, и его поток. Это виджет кода формы B виджет, чтобы дать вам представление:

StreamSubscription<RewardedVideoAdEvent> _videoAdSubscription;
......  
@override
void initState() {
  super.initState();

  if (mounted) {
    final AdMobBloc adMob =
      BlocProvider.of<AppProvider>(context).application.adMobBloc;
      _videoAdSubscription = adMob.outVideoAdEvents.listen((RewardedVideoAdEvent event) {
         if (event == RewardedVideoAdEvent.rewarded){
           // execute code 
         }  
     });
  }
}

@override
void dispose() {
  _videoAdSubscription?.cancel();
  super.dispose();
}

Это определения набора потоков:

PublishSubject<RewardedVideoAdEvent> _outVideoAdController =
PublishSubject<RewardedVideoAdEvent>();
StreamSink<RewardedVideoAdEvent> get _videoAdEvents => _outVideoAdController.sink;
Observable<RewardedVideoAdEvent> get outVideoAdEvents => _outVideoAdController.stream;

У меня есть проблема - в какой-то момент, Пользователь может решить изменить цветовую схему приложения. В этом случае я в основном перестраиваю все приложение. Когда это происходит, вызывается B:initState(), однако ему не предшествует B:dispose(), следовательно, происходит другая подписка на adMob.outVideoAdEvents. Побочный эффект этого - в следующий раз, когда происходит событие, обратный вызов вызывается дважды, следовательно, код выполняется дважды. Конечно, если пользователь перестраивает приложение несколько раз (путем изменения цвета), каждый раз, когда будет добавлен новый слушатель, следовательно, код будет выполняться больше.

Как решить этот случай?

Так что мой вопрос - как этого избежать

...