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
相关产品推荐
相关产品推荐

