【问题标题】:BannerAd.dispose Not Working Flutter AdmobBannerAd.dispose 不工作颤振 Admob
【发布时间】:2020-06-23 22:43:58
【问题描述】:

我目前正在尝试在我的应用程序中显示一个 admob 横幅,但是有两个页面我不希望显示横幅(现在我只使用设置路由进行测试),并在横幅上调用 dispose没有隐藏它。

我尝试了什么:

  1. 为每个小部件创建横幅并在小部件的 onDispose 方法的覆盖内调用 dispose 方法
  2. 创建一个创建横幅并保存对它的引用的广告管理器类,并从该类调用一个函数,该函数调用我不希望显示横幅的页面init 内的横幅上的 dispose。
  3. 我当前的解决方案:一个观察者类,它在推送时显示横幅,如果路由名称与我正在寻找的匹配隐藏横幅。

到目前为止,这些方法都没有成功:(我做错了什么?我错过了什么吗?

观察者类:

class AdmobObserver extends RouteObserver<PageRoute<dynamic>> {

  static ValueNotifier<bool> isBannerAdShowing = ValueNotifier<bool>(false);

  BannerAd _myBanner = BannerAd(
    adUnitId: AdManager.bannerAdUnitId,
    size: AdSize.banner,
    listener: (MobileAdEvent event) {
      if (event == MobileAdEvent.loaded) {
        isBannerAdShowing.value = true;
      }
      else if (event == MobileAdEvent.failedToLoad) {
        isBannerAdShowing.value = false;
      }
    },
  );

  @override
  void didPush(Route route, Route previousRoute) {
    super.didPush(route, previousRoute);
    if (route.settings.name == '/settings') {
      _myBanner?.dispose();
      isBannerAdShowing.value = false;
    } else {
      _showBannerAd();
    }
  }

  @override
  void didPop(Route route, Route previousRoute) {
    super.didPop(route, previousRoute);
    if (route.settings.name == '/settings') {
      _myBanner?.dispose();
      isBannerAdShowing.value = false;
    } else {
      _showBannerAd();
    }
  }

  void _showBannerAd() {
    _myBanner
      ..load()
      ..show();
  }
}

编辑: 我设法让观察者调用 dispose 但现在横幅要么不释放要么抛出异常:当我从 首页->设置->返回首页(首次构建应用程序时,我进入设置时横幅消失,但仍然出现错误,但之后当我热重启时出现同样的错误并且横幅仍然存在,同样的错误当我从其他页面弹出设置时也会发生(设置 -> 页面 -> 弹回设置)

 [ERROR:flutter/lib/ui/ui_dart_state.cc(166)] Unhandled Exception: 'package:firebase_admob/firebase_admob.dart': Failed assertion: line 249 pos 12: '_allAds[id] != null': is not true.
E/flutter (17108): #0      _AssertionError._doThrowNew (dart:core-patch/errors_patch.dart:42:39)
E/flutter (17108): #1      _AssertionError._throwNew (dart:core-patch/errors_patch.dart:38:5)
E/flutter (17108): #2      MobileAd.dispose (package:firebase_admob/firebase_admob.dart:249:12)
E/flutter (17108): #3      AdmobObserver.didPop (package:Switcheroo/AdManager.dart:87:18)

【问题讨论】:

  • 您目前使用的是哪个插件?
  • firebase_admob: ^0.9.3+2
  • 我认为它会在您第一次离开时进行处置,而当您回来时没有广告,因此它试图处置空值,您怎么看? ,也许在处理之前尝试检查它是否为空??
  • 我使用问号语法,所以它不应该在空对象上调用 dispose,当我第一次离开时,广告仍然可见,所以我什至认为它没有被释放
  • 返回的route 名称route.settings.name 是否与正在比较的值匹配?像任何区分大小写的错误或小错字一样?

标签: flutter dart admob observable firebase-admob


【解决方案1】:

你需要像这样处理横幅

try {
      _myBanner?.dispose();
      _myBanner = null;
    } catch (ex) {
      log("banner dispose error");
    }

【讨论】:

    【解决方案2】:

    也请参见此处,以及 BannerAd 上的 listener 属性的解决方案。对于恼人的错误,我似乎仍然需要 catch 块。尽管至少这样横幅可以正确隐藏。

    https://github.com/flutter/flutter/issues/21474

    【讨论】:

      猜你喜欢
      • 2021-11-02
      • 2020-05-04
      • 2018-10-11
      • 2021-12-11
      • 2022-01-25
      • 2020-07-12
      • 2020-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多