Flutter StatefulWidget-在哪里向BLOC流添加侦听器的最佳位置

时间:2020-03-10 09:46:02

标签: flutter rxdart

我有以下用例:

我有两个StatefullWidget(然后叫AB),每个TabBarView内。每个窗口小部件都有一个initStatedispose方法。当我在标签之间切换时,一切看起来都很好-例如当我从A切换到B时,首先调用了B:initState(),然后调用了A:dispose()。一切似乎都应该如此。 在B小部件中,我已经订阅了BLOC流。 BLOC是全球性的,因此也是其源头。 这是代码段表单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的另一次预订。这样做的副作用是-下次发生事件时,回调将被调用两次,因此代码将执行两次。当然,如果用户多次(通过更改颜色)重建应用程序,则每次添加新的侦听器时,都会执行更多代码。

如何处理此案?

所以我的问题是-如何避免这种情况

0 个答案:

没有答案
相关问题