Flutter集成Google原生广告出现LoadAdError(code:0)内部错误求助
问题:Flutter集成Google原生广告测试ID出现Internal error加载失败
我使用google_mobile_ads库在Flutter应用中集成Google原生广告,采用官方文档提供的测试ID,但加载时出现以下错误:
[log] NativeAd failed to load: LoadAdError(code: 0, domain: com.google.android.gms.ads, message: Internal error., responseInfo: ResponseInfo(responseId: _-SvZbabD5e-3LUP4oaxkAs, mediationAdapterClassName: , adapterResponses: [AdapterResponseInfo(adapterClassName: com.google.ads.mediation.admob.AdMobAdapter, latencyMillis: 83, description: { "Adapter": "com.google.ads.mediation.admob.AdMobAdapter", "Latency": 83, "Ad Source Name": "Reservation campaign", "Ad Source ID": "7068401028668408324", "Ad Source Instance Name": "[DevRel] [DO NOT EDIT] Native Ads Campaign", "Ad Source Instance ID": "3518433842871043", "Credentials": { "pubid": "ca-app-pub-3940256099942544/2247696110/cak=no_cache&cadc=c3&caqid=_-SvZfiWDr-FmsMPtMWtgAM", "campaign_id": "12584073087" }, "Ad Error": { "Code": 0, "Message": "Internal error.", "Domain": "com.google.android.gms.ads", "Cause": "null" } }, adUnitMapping: {pubid: ca-app-pub-3940256099942544/2247696110/cak=no_cache&cadc=c3&caqid=_-SvZfiWDr-FmsMPtMWtgAM, campaign_id: 12584073087}, adError: AdError(code: 0, domain: com.google.android.gms.ads, message: Internal error.), adSourceName: Reservation campaign, adSourceId: 7068401028668408324, adSourceInstanceName: [DevRel] [DO NOT EDIT] Native Ads Campaign, adSourceInstanceId: 3518433842871043)], loadedAdapterResponseInfo: null), responseExtras: {mediation_group_name: Campaign})
复现代码
Native Controller
import 'package:get/get.dart'; import 'package:google_mobile_ads/google_mobile_ads.dart'; class NativeAdController extends GetxController { NativeAd? ad; final adLoaded = false.obs; }
Ad Helper
import 'dart:developer'; import 'package:flutter/foundation.dart'; import 'package:google_mobile_ads/google_mobile_ads.dart'; import '../controllers/controller_native_ads.dart'; class AdHelper { static Future<void> initAds() async { await MobileAds.instance.initialize(); } void loadInterstitialAd({required VoidCallback onComplete}) { InterstitialAd.load( adUnitId: 'ca-app-pub-3940256099942544/1033173712', request: const AdRequest(), adLoadCallback: InterstitialAdLoadCallback( onAdLoaded: (ad) { ad.fullScreenContentCallback = FullScreenContentCallback( onAdDismissedFullScreenContent: (ad) { onComplete(); }, onAdFailedToShowFullScreenContent: (ad, error) { log(error.toString()); }, onAdShowedFullScreenContent: (ad) { log("Full Screen"); }, ); log('This is the $ad loaded.'); }, onAdFailedToLoad: (LoadAdError error) { log('InterstitialAd failed to load: $error'); }, ), ); } static NativeAd loadNativeAd({required NativeAdController nativeAdController}) { return NativeAd( adUnitId: 'ca-app-pub-3940256099942544/2247696110', listener: NativeAdListener( onAdLoaded: (ad) { log('$NativeAd loaded.'); nativeAdController.adLoaded.value = true; }, onAdFailedToLoad: (ad, error) { log('$NativeAd failed to load: $error'); ad.dispose(); }, ), request: const AdRequest(), nativeTemplateStyle: NativeTemplateStyle( templateType: TemplateType.small, ), )..load(); } }
Test Screen
import 'package:flutter/material.dart'; import '../controllers/controller_native_ads.dart'; class TestScreen extends StatelessWidget { TestScreen({super.key}); final adController = Get.put(NativeAdController()); @override Widget build(BuildContext context) { adController.ad = AdHelper.loadNativeAd(nativeAdController: adController); return Scaffold( bottomNavigationBar: adController.ad != null && adController.adLoaded.isTrue ? SafeArea( child: SizedBox( height: 80, child: AdWidget(ad: adController.ad!), ), ) : null, ); } }
回答
出现code: 0, Internal error的核心原因是广告加载时机错误,以及Widget重建导致的重复请求,具体分析和修复方案如下:
1. 根本原因
- build方法中重复加载广告:TestScreen的
build方法每次执行都会调用AdHelper.loadNativeAd,而Flutter的Widget会因状态变化频繁重建,短时间内向AdMob发送大量重复请求,触发服务端内部错误。 - 广告资源未正确管理:每次重建生成的新NativeAd实例,旧实例未及时释放,可能导致资源冲突。
2. 修复方案
(1)将广告移至Controller生命周期加载
修改NativeAdController,在初始化阶段加载广告,并在页面销毁时释放资源:
import 'package:get/get.dart'; import 'package:google_mobile_ads/google_mobile_ads.dart'; import '../helpers/ad_helper.dart'; class NativeAdController extends GetxController { NativeAd? ad; final adLoaded = false.obs; @override void onInit() { super.onInit(); // 在Controller初始化时加载广告,避免重复请求 ad = AdHelper.loadNativeAd(nativeAdController: this); } @override void onClose() { ad?.dispose(); // 页面销毁时释放广告资源 super.onClose(); } }
(2)修改TestScreen移除build中的加载代码
移除build方法内的广告加载逻辑,改用Obx监听状态变化:
import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../controllers/controller_native_ads.dart'; class TestScreen extends StatelessWidget { TestScreen({super.key}); final adController = Get.put(NativeAdController()); @override Widget build(BuildContext context) { return Scaffold( bottomNavigationBar: Obx(() => adController.ad != null && adController.adLoaded.value ? SafeArea( child: SizedBox( height: 80, child: AdWidget(ad: adController.ad!), ), ) : null), ); } }
(3)确保广告全局初始化完成
在App启动时先完成广告SDK初始化:
import 'package:flutter/material.dart'; import 'package:google_mobile_ads/google_mobile_ads.dart'; import './helpers/ad_helper.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); await AdHelper.initAds(); // 先初始化广告SDK runApp(const MyApp()); }
(4)添加重试机制(可选)
如果遇到临时服务端错误,可在onAdFailedToLoad中添加延迟重试逻辑,避免频繁请求:
// 修改AdHelper中的loadNativeAd方法 static NativeAd loadNativeAd({required NativeAdController nativeAdController}) { return NativeAd( adUnitId: 'ca-app-pub-3940256099942544/2247696110', listener: NativeAdListener( onAdLoaded: (ad) { log('$NativeAd loaded.'); nativeAdController.adLoaded.value = true; }, onAdFailedToLoad: (ad, error) { log('$NativeAd failed to load: $error'); ad.dispose(); // 延迟3秒后重试 Future.delayed(const Duration(seconds: 3), () { nativeAdController.ad = loadNativeAd(nativeAdController: nativeAdController); }); }, ), request: const AdRequest(), nativeTemplateStyle: NativeTemplateStyle( templateType: TemplateType.small, ), )..load(); }
内容的提问来源于stack exchange,提问作者Utsav Rai
相关产品推荐
相关产品推荐

