【问题标题】:How do I fix "Failed assertion: line 227 pos 12: '_allAds[id] !=null': is not true."?如何修复“断言失败:第 227 行 pos 12: '_allAds[id] !=null': is not true.”?
【发布时间】:2019-07-19 02:49:32
【问题描述】:

我正在尝试向我的应用添加横幅广告。我希望横幅显示在我的应用程序的某些页面上,但是一旦您到达某些页面,我希望横幅消失。所以我让我的横幅出现并且它正在工作。我还发现使用

super.dispose();
myBanner?.dispose();

在我的按钮上的 onPressed 将摆脱横幅。但是,当我弹回加载横幅的页面时,出现错误:

I/flutter (7058):处理手势时抛出以下断言: I/flutter (7058): 'package:firebase_admob/firebase_admob.dart': 断言失败: line 227 pos 12: '_allAds[id] != I/flutter (7058): null': 不正确。

然后我不能点击在 onPressed 上有我处置的任何按钮。

我尝试添加 super.dispose(),因为我只有 myBanner?.dispose();以前,但结果是一样的。我很难找到关于 admobs 的大量信息。

这是我设置横幅的方式:

    BannerAd myBanner = BannerAd(
      // Replace the testAdUnitId with an ad unit id from the AdMob dash.
      // https://developers.google.com/admob/android/test-ads
      // https://developers.google.com/admob/ios/test-ads
      adUnitId: adUnitId,
      size: AdSize.smartBanner,
      targetingInfo: targetingInfo,
      listener: (MobileAdEvent event) {
        print("BannerAd event is $event");
      },
    );

然后在我的课堂上:

    class EnMainMenu extends StatefulWidget {
      @override
      State<StatefulWidget> createState() => _MainMenuState();
    }
    
    class _MainMenuState extends State<EnMainMenu> {
      @override
      void initState() {
        super.initState();
    
        myBanner
          ..load()
          ..show(anchorOffset: 10.0, anchorType: AnchorType.bottom);
      }

以及我如何使用我的按钮:

 Align(
                alignment: Alignment.topRight,
                child: Container(
                    padding: EdgeInsets.all(20),
                    child: IconButton(
                      icon: Icon(
                        Icons.settings,
                        color: Colors.black45,
                        size: 40,
                      ),
                      onPressed: () {
                        myBanner?.dispose();
                        super.dispose();
                        Navigator.of(context).pushNamed('/EnSettings');
                      },
                    ))),

如果有更好的方法让横幅在某些页面上显示和隐藏,请告诉我。我对扑扑和飞镖很陌生。将来,我还会考虑添加插页式广告。

【问题讨论】:

  • 您可以使用 myBanner?.dispose(); 处理横幅并将其从 dispose 方法中删除。或者将其保留在 dispose 方法中并从按钮单击中删除。我认为它被调用了两次,在按钮单击和小部件处理时。
  • 所以我添加了额外的super.dispose();,而myBanner?.dispose(); 创建了该错误,并且在我添加super.dispose() 后问题仍然存在。是否有某种处理 admob 的隐藏变量?
  • 实际上我的意思是说,您可能已经调用了两次myBanner?.dispose(),一次是单击按钮,然后是一次处理方法,使其再次尝试处理,因此错误不能为空,因为它已被处理已经。
  • 要使用 dispose 解决这个问题,我是否要更改横幅的加载方式,以便在弹出窗口中加载新的横幅?有这个吗?void initState() { super.initState(); myBanner ..load() ..show(anchorOffset: 10.0, anchorType: AnchorType.bottom); }
  • 同样的问题,你解决了吗?

标签: flutter dart admob banner


【解决方案1】:

从 firebase_admob "v0.9.3+2" 开始,此代码适用于我

void disposeAd() {
    log.d("Calling disposeAd");
    try {

      _bannerAd?.dispose();
      _bannerAd = null;

    } catch (ex) {
      log.e("banner dispose error");
    }
  }

【讨论】:

    【解决方案2】:

    我通过在 firebase_admob.dart 文件中评论 //assert(_allAds[id] != null); 解决了这个问题。我不确定这是否是最好的解决方案,但对我来说效果很好。

    【讨论】:

      【解决方案3】:

      库中的这个断言很烦人。
      除了丢弃横幅广告,他们没有提供任何隐藏横幅广告的方法,我经常被这种说法所困扰......

      我的解决方法是(很遗憾):

      try {
          _bannerAd?.dispose();
        } catch (ex) {}
      

      【讨论】:

      • 这里也一样。但是使用 try/catch 并没有隐藏横幅。对这个颤振插件感到羞耻。没有办法隐藏它。
      • 我发现了。您必须在 _bannerAd?.dispose() 之后调用 _bannerAd= null 才能关闭它。
      猜你喜欢
      • 2021-03-07
      • 2020-06-05
      • 2020-11-24
      • 2020-11-30
      • 1970-01-01
      • 1970-01-01
      • 2021-02-25
      • 2023-01-24
      • 2018-12-28
      相关资源
      最近更新 更多