You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 12:57:33