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

Flutter应用中AdMob测试广告集成失败问题求助

Flutter中AdMob测试广告加载失败(No fill)问题排查

问题描述

我花费数天时间仍无法让AdMob测试广告在Flutter应用中正常运行,这是耗时最久却毫无进展的一次尝试。数月前尝试时就遇到过相同错误,原本以为是身份验证问题,但排除了该可能。已完成Firebase初始化、配置测试设备ID、Manifest中配置AdMob应用ID等操作,问题依旧。

相关代码

Ads组件代码

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:google_mobile_ads/google_mobile_ads.dart';

class Ads extends StatefulWidget {
  @override
  State<Ads> createState() => AdsState();
}

class AdsState extends State<Ads> {
  RewardedAd? _rewardedAd;
  int _rewardedScore = 0;

  final _adUnitId = 'ca-app-pub-3940256099942544/5224354917';

  @override
  void initState() {
    super.initState();
    _createRewardedAd();
  }

  void _createRewardedAd() {
    RewardedAd.load(
        adUnitId: _adUnitId,
        request: const AdRequest(),
        rewardedAdLoadCallback: RewardedAdLoadCallback(
          onAdLoaded: (ad) {
            debugPrint('$ad loaded.');
            _rewardedAd = ad;
          },
          onAdFailedToLoad: (LoadAdError error) {
            debugPrint('RewardedAd failed to load: $error');
          },
        ));
  }

  @override
  void dispose() {
    _rewardedAd?.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      decoration: const BoxDecoration(
        gradient: LinearGradient(
          colors: [Color(0xFF303030), Color(0xFF6B46C1), Color(0xFF303030)],
          begin: Alignment.topLeft,
          end: Alignment.bottomRight,
          stops: [0.05, 0.5, 1],
        ),
      ),
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: [
          DefaultTextStyle(
              style: TextStyle(
                  fontSize: 15,
                  fontFamily: GoogleFonts.akatab().fontFamily,
                  color: Colors.white,
                  fontWeight: FontWeight.bold),
              child: Text('Reward Ad : $_rewardedScore')),
          SizedBox(height: 20),
          ElevatedButton(
            onPressed: _showRewardedAd,
            child: const Text('Get 1 Free score'),
          )
        ],
      ),
    );
  }

  void _showRewardedAd() {
    try {
      _rewardedAd?.fullScreenContentCallback = FullScreenContentCallback(
        onAdDismissedFullScreenContent: (ad) {
          ad.dispose();
          _createRewardedAd();
        },
        onAdFailedToShowFullScreenContent: (ad, error) {
          ad.dispose();
          _createRewardedAd();
        },
      );

      _rewardedAd?.show(
        onUserEarnedReward: (ad, reward) {
          setState(() {
            _rewardedScore += reward.amount.toInt();
          });
        },
      );
      _rewardedAd = null;
    } catch (error) {
      print('Something went wrong');
    }
  }
}

Main函数代码

import 'package:google_mobile_ads/google_mobile_ads.dart';
import 'package:firebase_core/firebase_core.dart';
void main() async {
  try {
    WidgetsFlutterBinding.ensureInitialized();
    MobileAds.instance.initialize();
    final List<String> testDeviceIds = ["XXXXXXXXXXXX"];
    final RequestConfiguration configuration =
        RequestConfiguration(testDeviceIds: testDeviceIds);
    MobileAds.instance.updateRequestConfiguration(configuration);
  } catch (error) {
    print("Error :  $error");
  }
  runApp(const MyApp());
}

关键日志

I/DynamiteModule(31513): Considering local module com.google.android.gms.ads.dynamite:0 and remote module com.google.android.gms.ads.dynamite:240304704
I/DynamiteModule(31513): Selected remote version of com.google.android.gms.ads.dynamite, version >= 240304704
W/Ads     (32615): Invoke Firebase method getInstance error.
W/Ads     (31513): The Google Mobile Ads SDK will not integrate with Firebase. Admob/Firebase integration requires the latest Firebase SDK jar, but Firebase SDK is either missing or out of date
I/Ads     (31513): Ad failed to load : 3
I/flutter (31513): RewardedAd failed to load: LoadAdError(code: 3, domain: com.google.android.gms.ads, message: No fill., responseInfo: ResponseInfo(responseId: null, mediationAdapterClassName: , adapterResponses: [], loadedAdapterResponseInfo: null), responseExtras: {})

解决思路

  • 修复Firebase与AdMob集成顺序及依赖版本:日志明确提示Firebase SDK版本问题,需确保pubspec.yaml中所有Firebase相关依赖使用最新稳定版,执行flutter pub get更新。同时调整初始化顺序,先完成Firebase初始化再初始化AdMob:
    WidgetsFlutterBinding.ensureInitialized();
    await Firebase.initializeApp(); // 优先初始化Firebase
    MobileAds.instance.initialize();
    
  • 确认测试设备ID准确性:通过日志中I/Ads: Use AdRequest.Builder.addTestDevice("XXX")的提示获取精确设备ID,替换当前代码中的占位符,避免手动输入错误。
  • 排查"No fill"错误的其他诱因:
    • 测试广告填充率并非100%,可添加重试逻辑,在加载失败后延迟3-5秒重新请求;
    • 检查设备的Google Play服务是否为最新版本,过时服务会导致广告加载异常;
    • 避免使用VPN或受限网络,确保设备能正常访问AdMob服务器;
    • 确认AdMob后台已正确创建应用,Manifest中的应用ID与后台完全匹配。
  • 优化广告加载逻辑:在_createRewardedAd的失败回调中添加重试机制,避免单次失败后无法获取广告:
    void _createRewardedAd() {
      RewardedAd.load(
          adUnitId: _adUnitId,
          request: const AdRequest(),
          rewardedAdLoadCallback: RewardedAdLoadCallback(
            onAdLoaded: (ad) {
              debugPrint('$ad loaded.');
              _rewardedAd = ad;
            },
            onAdFailedToLoad: (LoadAdError error) {
              debugPrint('RewardedAd failed to load: $error');
              // 延迟3秒重试
              Future.delayed(const Duration(seconds: 3), _createRewardedAd);
            },
          ));
    }
    

内容的提问来源于stack exchange,提问作者Thanos Rom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 12:15:25