颤振:如何防止横幅广告在视图已释放时显示



我目前正在尝试来自firebase_admob插件的横幅广告。显示和处置它们的过程非常简单,我在 initState(( 和 dispose(( 中执行此操作。

用于创建和显示添加的代码如下所示:

_bannerAd = createBannerAd();
_bannerAd
  ..load().then((loaded) {
    if (loaded) {
      _bannerAd..show();
    }
  });

但是,由于我异步调用 show((,因此在展示广告时视图可能已经关闭(即通过非常快速地单击后退按钮(。在这种情况下,将永远不会调用dispose((方法,并且广告将"卡"在屏幕底部。

如何解决这个问题?我是否错误地使用了横幅广告,或者是否可以检测到视图是否已更改?我尝试使用状态的"mounted"属性,但它似乎不起作用。

只需在显示添加之前检查状态类的"this.mounted"属性。

    _bannerAd = createBannerAd();
    _bannerAd
  ..load().then((loaded) {
    if (loaded && this.mounted) {
      _bannerAd..show();
    }
  });

从 https://github.com/flutter/flutter/issues/21474#issuecomment-535188820 来看,这是一个小技巧,但它对我有用。

您可以在释放方法中添加一点延迟,如下所示:

static void hideBannerAd() {
  Future.delayed(Duration(milliseconds: 500), () {
    if (_bannerAd != null) _bannerAd.dispose();
    _bannerAd = null;
  });
}

500毫秒就足够了。

最新更新