Флаттер firebase_admob показать только один раз - PullRequest
0 голосов
/ 04 февраля 2019

Следующий код показывает рекламный баннер внизу приложения и показывает промежуточную рекламу при клике.Промежуточная реклама показывается при нажатии кнопки.Проблема в том, что когда приложение запускается и нажимает кнопку в первый раз, вставка отображается, но вставка не отображается, начиная со второго раза.Там нет ошибок и все сообщения журнала показывают успех.Ошибка моего кода?Я тестирую на устройстве Android.

import 'package:firebase_admob/firebase_admob.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {

  final admobAppId = 'ca-app-pub-3940256099942544~3347511713';
  final bannerId = 'ca-app-pub-3940256099942544/6300978111';
  final interstitialId = 'ca-app-pub-3940256099942544/1033173712';

  BannerAd bannerAd;
  InterstitialAd interstitialAd;

  MyApp() {
    FirebaseAdMob.instance.initialize(appId: admobAppId);
    makeBannerAd();
    initInterstitialAd();
  }

  makeBannerAd() {
    bannerAd = BannerAd(
        adUnitId: bannerId,
        size: AdSize.smartBanner,
        listener: (MobileAdEvent me) {
          print('MobileAdEvent $me');
        });
    bannerAd
      ..load()
      ..show();
  }

  initInterstitialAd() {
    interstitialAd = InterstitialAd(
        adUnitId: interstitialId,
        listener: (MobileAdEvent me) {
          print(
              '========== Interstitial ad mobile ad event =========== \n $me');
          if (me == MobileAdEvent.closed) {
            print('Interstitial closed');
            loadInterstitialAd();
          }
        });
    loadInterstitialAd();
  }

  loadInterstitialAd() {
    interstitialAd.load().then((val) {
      if (val) {
        print('Interstitial ad loaded callback success');
      } else {
        print('Interstitial ad loaded callback failed');
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('AdMob plugin test'),
        ),
        body: Center(
          child: RaisedButton(
            child: Text('Show Interstitial!'),
            onPressed: () {
              interstitialAd.show().then((val) {
                if (val) {
                  print('Interstitial ad show callback success');
                } else {
                  print('Interstitial ad show callback fail');
                }
              });
            },
          ),
        ),
      ),
    );
  }
}

Обновление
Ниже приведен код с dispose ().Это показывают до 2 раз.

class MyApp extends StatelessWidget {

  final admobAppId = 'ca-app-pub-3940256099942544~3347511713';
  final bannerId = 'ca-app-pub-3940256099942544/6300978111';
  final interstitialId = 'ca-app-pub-3940256099942544/1033173712';

  BannerAd bannerAd;
  InterstitialAd interstitialAd;
  MobileAdTargetingInfo mobileAdTargetingInfo;

  MyApp() {
    FirebaseAdMob.instance.initialize(appId: admobAppId);
    makeBannerAd();
    initInterstitialAd();
  }

  makeBannerAd() {
    bannerAd = BannerAd(
        adUnitId: bannerId,
        size: AdSize.smartBanner,
        listener: (MobileAdEvent me) {
          print('Banner => MobileAdEvent $me');
        });
    bannerAd
      ..load()
      ..show();
  }

  initInterstitialAd() {
    interstitialAd = InterstitialAd(
        adUnitId: interstitialId,
        listener: (MobileAdEvent me) {
          print(
              '========== Interstitial ad mobile ad event =========== $me');
          if (me == MobileAdEvent.closed) {
            print('Interstitial closed');
            interstitialAd.dispose().then((val){
              if(val){
                loadInterstitialAd();
              }else{
              }
            });
          } else if (me == MobileAdEvent.failedToLoad) {
            print('Interstitial failed to load');
            loadInterstitialAd();
          }
        });
    loadInterstitialAd();
  }

  loadInterstitialAd() {
    interstitialAd.load();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('AdMob plugin test'),
        ),
        body: Center(
          child: RaisedButton(
            child: Text('Show Interstitial!'),
            onPressed: () {
              interstitialAd.show();
            },
          ),
        ),
      ),
    );
  }
}

Ответы [ 3 ]

0 голосов
/ 09 февраля 2019

Я изменил и исправил код следующим образом, а также опубликовал в выпуске github .Теперь при каждом нажатии кнопки показывается реклама.Я тестировал 10+ раз, и это работает хорошо.Кажется, InterstitialAd нужно создавать каждый раз, когда требуется показ рекламы.Но я не знаю точно.Если есть кто-то, кто знает, почему, пожалуйста, объясните мне.

import 'package:flutter/material.dart';
import 'package:firebase_admob/firebase_admob.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  BannerAd myBanner;

  MyApp() {
    FirebaseAdMob.instance.initialize(appId: FirebaseAdMob.testAppId);
    myBanner =
        BannerAd(adUnitId: BannerAd.testAdUnitId, size: AdSize.smartBanner);
    myBanner
      ..load()
      ..show();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text("Interstitial Ad test"),
        ),
        body: Center(
          child: RaisedButton(
            child: Text("Interstitial ad"),
            onPressed: () {
              InterstitialAd interstitialAd = new InterstitialAd(
                  adUnitId: InterstitialAd.testAdUnitId,
                  listener: (MobileAdEvent e) {
                    print("Mobile ad event => $e");
                  });
              interstitialAd.load().then((val) {
                interstitialAd.show();
              });
            },
          ),
        ),
      ),
    );
  }
}
0 голосов
/ 22 августа 2019

У меня была такая же проблема, и я решил ее с помощью объекта InterstitialAd , как показано:

InterstitialAd myInterstitial() {
    return InterstitialAd(
      adUnitId: InterstitialAd.testAdUnitId,
      targetingInfo: targetingInfo,
      listener: (MobileAdEvent event) {
        if (event == MobileAdEvent.failedToLoad) {
          interstitialAd..load();
        } else if (event == MobileAdEvent.closed) {
          interstitialAd = myInterstitial()..load();
        }
      },
    );
  }
@override
void initState() {
    FirebaseAdMob.instance.initialize(appId: 
        FirebaseAdMob.testAppId);
    interstitialAd = myInterstitial()..load();
    super.initState();
}
@override
void dispose() {
    interstitialAd?.dispose();
    super.dispose();
}

Метод вызова:

interstitialAd
  ..load()
  ..show();

Насколько я понимаю, выможет использовать слушатель для рекурсивного вызова исходного InterstitialAd объекта, когда событие закрыто.Мой источник с Канал Tensor Programming Youtube Он объясняет это намного лучше меня.

0 голосов
/ 08 февраля 2019

Я столкнулся с той же проблемой.Решение простое.

Просто используйте interstitialAd.dispose(), чтобы разместить объявление так, чтобы в следующий раз загружалось новое промежуточное объявление.

...