Admob横幅广告,如何只在主页显示

13

我已成功地在页脚上显示智能横幅,然后将其处理掉。我的问题是它出现在应用程序的所有页面上。

我的问题是:如何只在一个页面上显示?

@override
 void initState() {
   super.initState();
   myBanner
   ..load().then((loaded) {
     if (loaded && this.mounted) {
       myBanner..show();
     }
   });

 }
5个回答

15

我在Github链接这里找到了可行的解决方案。 这个想法非常简单。

  1. 首先需要一个Ads助手类。 您可以关注下面的链接或查看以下内容。
  2. 在要显示广告的页面的initState()中调用showBannerAd
  3. 在推送页面后,像下面的代码段一样调用showBannerAd。 这将在您从推送页面返回后再次显示广告。
Navigator.push(context, MaterialPageRoute(builder: (context) => EditPage())).then((value) {
                      Ads.showBannerAd();
                    });
  1. 在不想显示广告的推送页面的initState()中调用hideBannerAd,然后你就完成了。

我的广告帮助类

import 'package:firebase_admob/firebase_admob.dart';

const String testDevice = 'YOUR_DEVICE_ID';

class Ads {
  static BannerAd _bannerAd;

  static void initialize() {
    FirebaseAdMob.instance.initialize(appId: FirebaseAdMob.testAppId);
  }

  static const MobileAdTargetingInfo targetingInfo = MobileAdTargetingInfo(
    testDevices: testDevice != null ? <String>[testDevice] : null,
    keywords: <String>['foo', 'bar'],
    contentUrl: 'http://foo.com/bar.html',
    childDirected: true,
    nonPersonalizedAds: true,
  );

  static BannerAd _createBannerAd() {
    return BannerAd(
      adUnitId: BannerAd.testAdUnitId,
      size: AdSize.banner,
      targetingInfo: targetingInfo,
      listener: (MobileAdEvent event) {
        print("BannerAd event $event");
      },
    );
  }

  static void showBannerAd() {
    if (_bannerAd == null) _bannerAd = _createBannerAd();
    _bannerAd
      ..load()
      ..show(anchorOffset: 0.0, anchorType: AnchorType.bottom);
  }

  static void hideBannerAd() async {
    await _bannerAd.dispose();
    _bannerAd = null;
  }
}


非常感谢!超级简单。又是一个Flutter Hack,但足够好的解决方案,直到Flutter团队添加三个本地应用程序为止。 - johnw182

1
如果您有多个充当单独屏幕的小部件,只需包含该部分。
@override void initState() { 
    super.initState(); 
    myBanner ..load().then((loaded) { 
        if (loaded && this.mounted) { 
            myBanner..show(); 
        } 
    }); 
}

您可能需要处理它:
@override
  void dispose() {
    myBanner?.dispose();
    super.dispose();
}

1
谢谢您的回复,但这正是我的问题。一旦初始化,横幅将在所有页面上显示,即使该代码仅在一个页面上。 - Alvin Konda
我正在通过以下代码导航到其他页面: '() => Navigator.push(context, new MaterialPageRoute(builder: (context) => new NewPage()' - Alvin Konda
当您的新屏幕在导航器中被调用时,您只需将横幅包含在特定屏幕的开头即可。请分享您其中一个屏幕的更多代码。 - Bostrot
1
正如我所说,问题很简单。一旦横幅被初始化,它将显示在所有屏幕上,无论它在哪里初始化。好的,让我给你我的代码。 - Alvin Konda
有没有解决方案?我也在寻找同样问题的答案。 - LiveRock
显示剩余14条评论

0

调用

Navigator.pop();

在调用Navigator.push()之前。这将解决你的问题。

0
我在给我的应用添加广告时遇到了同样的问题。在我的情况下,我在didChangeDependencies函数中调用了显示横幅广告的方法。这个方法可能会被应用程序多次调用,我发现(在我的应用程序中)当您将新路由推送到Navigator时,它会被调用,这就是为什么在我移动到应用程序的其他屏幕时会调用显示横幅的方法。也许你有类似的实现。

0

你可以使用 await 等待第二页的弹出

   bannerAd.dispose();
await Navigator.pushNamed(context, f['route']);
       intialzeAdd(); 

intialiazeAdd 在第二个屏幕弹出后被调用


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接