flutter - Rewarded Video Ads Error when Reload : “ad_not_loaded, show failed for rewarded video, no ad was loaded, null)”

后端 未结 4 1548
无人及你
无人及你 2021-02-20 10:56

i try to reload Rewarded Video Ads, when i call RewardedVideoAd.instance.load(adUnitId: \"xxx\", targetingInfo: xyz); i find below error :

相关标签:
4条回答
  • 2021-02-20 11:39

    Hi I think the best solution is using try catch and if there is a problem we can try to show it again. Here is my code;

    MobileAdTargetingInfo targetingInfo = MobileAdTargetingInfo(
      keywords: <String>['flutterio', 'beautiful apps'],
      contentUrl: 'https://flutter.io',
      childDirected: false,
      testDevices: <String>[],
    );
    
    String adUnit = "ca-app-pub-6288831324909345/9733176442";
    bool tryAgain = false;
    
    await RewardedVideoAd.instance
        .load(adUnitId: adUnit, targetingInfo: targetingInfo);
    
    try {
      await RewardedVideoAd.instance.show();
    } on PlatformException catch (e) {
      tryAgain = true;
      print(e.message);
    }
    
    RewardedVideoAd.instance.listener =
        (RewardedVideoAdEvent event, {String rewardType, int rewardAmount}) {
      switch (event) {
        case RewardedVideoAdEvent.rewarded:
          setState(() {
            // Here, apps should update state to reflect the reward.
            print("_goldCoins += rewardAmount");
          });
          break;
    
        case RewardedVideoAdEvent.loaded:
          if (tryAgain) RewardedVideoAd.instance.show();
          break;
    
        default:
          print(event.toString());
          break;
      }
    };
    
    0 讨论(0)
  • 2021-02-20 11:48

    No need for calling set state as it is expensive and causes a full rebuild.

    This problem can easily be fixed in the following way:

    import 'package:flutter/material.dart';
    import 'package:firebase_admob/firebase_admob.dart';
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
      // This widget is the root of your application.
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
            title: 'Flutter Demo',
            theme: ThemeData(
              primarySwatch: Colors.blue,
            ),
            home: HomePage());
      }
    }
    
    class HomePage extends StatefulWidget {
      HomePage({Key key}) : super(key: key);
    
      @override
      _HomePageState createState() => _HomePageState();
    }
    
    class _HomePageState extends State<HomePage> {
      //The targeting info required for Rewarded Videos Ads
      MobileAdTargetingInfo targetingInfo = MobileAdTargetingInfo(
        keywords: <String>['flutterio', 'beautiful apps'],
        contentUrl: 'https://flutter.io',
        childDirected: false,
        testDevices: <String>[], // Android emulators are considered test devices
      );
    
      //An instance to be called in the init state
      RewardedVideoAd _videoAd = RewardedVideoAd.instance;
    
      @override
      void initState() {
        //---------------------------------------//
        //Initialise the listener with the values.
        _videoAd.listener =
            (RewardedVideoAdEvent event, {String rewardType, int rewardAmount}) {
          if (event == RewardedVideoAdEvent.completed) {
            //When the video ad gets completed load a new video ad
            _videoAd
                .load(
                    adUnitId: RewardedVideoAd.testAdUnitId,
                    targetingInfo: targetingInfo)
                .catchError((e) => print('Error in loading.'));
          }
    
          //On every other event change pass the values to the _handleEvent Method.
          _handleEvent(event, rewardType, 'Reward', rewardAmount);
        };
        //------------------------------------------------------------------//
    
        //This will load the video when the widget is built for the first time.
        _videoAd
            .load(
                adUnitId: RewardedVideoAd.testAdUnitId,
                targetingInfo: targetingInfo)
            .catchError((e) => print('Error in loading.'));
    
        //-----------------------------------------------------//
        super.initState();
      }
    
      //---- Useful function to know exactly what is being done ----//
      void _handleEvent(RewardedVideoAdEvent event, String rewardType,
          String adType, int rewardAmount) {
        switch (event) {
          case RewardedVideoAdEvent.loaded:
            _showSnackBar('New Admob $adType Ad loaded!', 1500);
            break;
          case RewardedVideoAdEvent.opened:
            _showSnackBar('Admob $adType Ad opened!', 1500);
            break;
          //
          //The way we are fixing the issue is here.
          //This is by calling the video to be loaded when the other rewarded video is closed.
          case RewardedVideoAdEvent.closed:
            _showSnackBar('Admob $adType Ad closed!', 1500);
            _videoAd
                .load(
                    adUnitId: RewardedVideoAd.testAdUnitId,
                    targetingInfo: targetingInfo)
                .catchError((e) => print('Error in loading.'));
            break;
          case RewardedVideoAdEvent.failedToLoad:
            _showSnackBar('Admob $adType failed to load.', 1500);
            break;
          case RewardedVideoAdEvent.rewarded:
            _showSnackBar('Rewarded $rewardAmount', 3000);
            break;
          default:
        }
      }
    
      //Snackbar shown with ad status
      void _showSnackBar(String content, int duration) {
        Scaffold.of(context).showSnackBar(SnackBar(
          content: Text(content),
          duration: Duration(milliseconds: duration),
        ));
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: Center(
            child: FlatButton(
              child: Text('Play AD'),
              onPressed: () {
                _videoAd.show().catchError(
                    (e) => print("error in showing ad: ${e.toString()}"));
              },
            ),
          ),
        );
      }
    }
    
    
    
    0 讨论(0)
  • 2021-02-20 11:50

    Seems like the issue was with the event completed. Check out this code.

    MobileAdTargetingInfo targetingInfo = MobileAdTargetingInfo(
      keywords: <String>['flutterio', 'beautiful apps'],
      contentUrl: 'https://flutter.io',
      childDirected: false,
      testDevices: <String>[], // Android emulators are considered test devices
    );
    bool _loaded = false;
    
    @override
    void initState() {
      super.initState();
    
      // load ad in the beginning
      RewardedVideoAd.instance
          .load(adUnitId: RewardedVideoAd.testAdUnitId, targetingInfo: targetingInfo)
          .catchError((e) => print("error in loading 1st time"))
          .then((v) => setState(() => _loaded = v));
    
      // ad listener
      RewardedVideoAd.instance.listener = (RewardedVideoAdEvent event, {String rewardType, int rewardAmount}) {
        if (event == RewardedVideoAdEvent.closed) {
          RewardedVideoAd.instance
              .load(adUnitId: RewardedVideoAd.testAdUnitId, targetingInfo: targetingInfo)
              .catchError((e) => print("error in loading again"))
              .then((v) => setState(() => _loaded = v));
        }
      };
    }
    
    
    @override
    Widget build(BuildContext context) {
      return Scaffold(
        body: Center(
          child: Text(
            "Loaded = ${_loaded}",
            style: TextStyle(fontSize: 32, fontWeight: FontWeight.bold),
          ),
        ),
        floatingActionButton: FloatingActionButton(
          // show ad on FAB click
          onPressed: () async {
            await RewardedVideoAd.instance.show().catchError((e) => print("error in showing ad: ${e.toString()}"));
            setState(() => _loaded = false);
          },
        ),
      );
    }
    
    0 讨论(0)
  • 2021-02-20 12:00

    You can simply caught the exception as shown below:

    myRewardVideoAd.show()
    .catchError((e) => print("error in showing ad: ${e.toString()}"));
    
    0 讨论(0)
提交回复
热议问题