performLoadAd method

  1. @override
Future<AppOpenAd?> performLoadAd({
  1. AdRequest? request,
})
override

Implementation

@override
Future<AppOpenAd?> performLoadAd({AdRequest? request}) {
  if (request != null) {
    _lastRequest = request;
  }
  if (!_isAppOpenAdEnabled) {
    LogUtils.w('$adsType: AppOpenAd enable:$_isAppOpenAdEnabled');
    return Future.value(null);
  }
  if (!AdsManager.isMobileAdsInitializeCalled) {
    LogUtils.w('$adsType: Mobile Ads not initialized, ad loading canceled');
    return Future.value(null);
  }
  if (_isLoadingAd || _isAdAvailable) {
    // 开屏广告同一时刻只允许一个加载流程,避免重复请求和状态覆盖。
    LogUtils.d("$adsType load already in progress or ad available");
    return Future.value(null);
  }
  _isLoadingAd = true;
  bool isTimedOut = false;
  AppOpenAd? loadedAd;
  final completer = Completer<AppOpenAd?>();

  void completeCompleter([AppOpenAd? ad]) {
    _isLoadingAd = false;
    _isAdAvailable = ad != null;
    if (ad != null) {
      _appOpenLoadTime = DateTime.now();
    }
    if (!completer.isCompleted) {
      completer.complete(ad);
    }
  }

  void disposeAd() {
    loadedAd?.dispose();
    loadedAd = null;
  }

  AppOpenAd.load(
    adUnitId: adUnitId,
    request: _lastRequest ?? defaultRequest,
    adLoadCallback: AppOpenAdLoadCallback(
      onAdLoaded: (ad) {
        _resetRetryState();
        loadedAd = ad;
        if (isTimedOut) {
          disposeAd();
          return;
        }
        LogUtils.d("$adsType loaded successfully");
        completeCompleter(ad);
      },
      onAdFailedToLoad: (error) {
        LogUtils.e("$adsType load failed.", error: error);
        completeCompleter();
        _scheduleRetry();
      },
    ),
  );
  return completer.future.timeout(kLoadTimeout, onTimeout: () {
    isTimedOut = true;
    LogUtils.d('$adsType: Ad load timed out');
    disposeAd();
    completeCompleter();
    _scheduleRetry();
    return null;
  }).catchError((e) => null);
}