我有以下用例:
我有两个StatefullWidget
(然后叫A
和B
),每个TabBarView
内。每个窗口小部件都有一个initState
和dispose
方法。当我在标签之间切换时,一切看起来都很好-例如当我从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
的另一次预订。这样做的副作用是-下次发生事件时,回调将被调用两次,因此代码将执行两次。当然,如果用户多次(通过更改颜色)重建应用程序,则每次添加新的侦听器时,都会执行更多代码。
如何处理此案?
所以我的问题是-如何避免这种情况