performLoadAd method
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);
}