Flutter:加载时显示rewardedAd

Dan*_*ani 5 admob flutter flutter-dependencies google-mobile-ads

为了展示广告,我这样做:

await adState.showRewardedAd();
await adState.rewardedAd!.show(onUserEarnedReward: (RewardedAd ad, RewardItem reward) {
// reward
});
Run Code Online (Sandbox Code Playgroud)

和:

Future createRewardedAd([bool showVideo = false]) async {
    await RewardedAd.load(
      adUnitId: rewardeUnitAdId,
      request: request,
      rewardedAdLoadCallback: RewardedAdLoadCallback(
        onAdLoaded: (RewardedAd ad) async {
          adState.rewardedAd = ad;
          _numRewardedLoadAttempts = 0;
          if (showVideo) {
            showRewardedAd();
          }
        },
        onAdFailedToLoad: (LoadAdError error) async {
          adState.rewardedAd = null;
          _numRewardedLoadAttempts += 1;
          if (_numRewardedLoadAttempts <= maxFailedLoadAttempts) {
            await createRewardedAd();
          }
        },
      ),
    );
  }

  Future<void> showRewardedAd() async {
    if (adState.rewardedAd == null) {
      return await createRewardedAd(true);
    }

    adState.rewardedAd!.fullScreenContentCallback =
        await FullScreenContentCallback(
      onAdShowedFullScreenContent: (RewardedAd ad) => {},
      onAdDismissedFullScreenContent: (RewardedAd ad) async {
        ad.dispose();
        await createRewardedAd();
      },
      onAdFailedToShowFullScreenContent: (RewardedAd ad, AdError error) async {
        ad.dispose();
        await createRewardedAd();
      },
    );
  }
Run Code Online (Sandbox Code Playgroud)

因此,每次我们关闭奖励广告时,我们都会再次创建/加载它,以便为下次做好准备。直到这里一切都很好。


当我们点击再次显示它的速度太快时,问题就出现了。当我们这样做时:

if (adState.rewardedAd == null) {
      return await createRewardedAd(true);
    }
Run Code Online (Sandbox Code Playgroud)

我强制加载它并等待,await RewardedAd.load()但尽管我等待,该onAdLoaded事件仍然需要一些时间,并且异步函数不知道它尚未准备好。

所以,当我这样做时,await adState.rewardedAd!它可以为空。

我怎样才能让这个更安全?谷歌的文档没有涵盖这一点