Flutter项目中Firebase AdMob广告在模拟器正常显示但真机无法展示的问题
解决Flutter广告模拟器正常、真机不显示的问题
我来帮你排查这个广告展示的问题,结合你的代码和日常开发里遇到的坑,整理了几个关键的排查方向和解决方案:
1. 测试设备配置缺失
你的代码里定义了testDevice变量,但并没有实际配置到广告请求里。真机如果没被标记为测试设备,AdMob可能因为广告政策限制不展示广告(防止误点击产生收益)。
解决步骤:
- 运行App后,查看控制台日志,会输出类似这样的内容:
Use RequestConfiguration.Builder().setTestDeviceIds(Arrays.asList("XXXX-XXXX-XXXX-XXXX"))...,把里面的设备ID复制出来。 - 在FirebaseAdMob初始化后添加测试设备配置,示例如下:
final RequestConfiguration requestConfiguration = RequestConfiguration( testDeviceIds: ['复制的真机设备ID'], ); FirebaseAdMob.instance.updateRequestConfiguration(requestConfiguration);
2. 广告单元ID/App ID的问题
- 先暂时替换为AdMob官方提供的测试广告单元ID验证:Banner广告的测试ID是
ca-app-pub-3940256099942544/6300978111,如果这个测试ID能在真机显示,说明你自己的广告单元ID可能存在问题(比如未通过审核、暂无广告填充、或者ID填写错误)。 - 确认你的App ID和广告单元ID在AdMob后台是正确配置的,应用状态为已通过审核,广告单元已启用。
3. 代码生命周期问题
你把广告的创建、加载和显示逻辑放在了main函数里,此时Widget树还未完全构建,可能导致广告无法正确附着到界面上。建议把广告逻辑放到根Widget的initState生命周期中,同时记得在dispose里销毁广告避免内存泄漏。
4. 平台配置缺失
检查Android和iOS的配置是否完整:
Android端
- 在
AndroidManifest.xml中添加INTERNET权限:
<uses-permission android:name="android.permission.INTERNET"/>
- 添加AdMob的App ID配置:
<meta-data android:name="com.google.android.gms.ads.APPLICATION_ID" android:value="你的App ID"/>
iOS端
- 在
Info.plist中添加App ID配置:
<key>GADApplicationIdentifier</key> <string>你的App ID</string>
修改后的示例代码
import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_admob/firebase_admob.dart'; import 'package:flutter/material.dart'; const String DWWCBannerAdUnit = "ca-app-pub-3940256099942544/6300978111"; // 先用官方测试ID验证 const String DWWCAppId = "ca-app-pub-366*******150~415*****06"; Future<void> main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(); // 配置测试设备,替换为你真机的ID final RequestConfiguration requestConfiguration = RequestConfiguration( testDeviceIds: ['你的真机测试设备ID'], ); await FirebaseAdMob.instance.initialize(appId: DWWCAppId); FirebaseAdMob.instance.updateRequestConfiguration(requestConfiguration); runApp(const DWWCApp()); } class DWWCApp extends StatefulWidget { const DWWCApp({Key? key}) : super(key: key); @override State<DWWCApp> createState() => _DWWCAppState(); } class _DWWCAppState extends State<DWWCApp> { BannerAd? _bannerAd; BannerAd createBannerAd() { return BannerAd( adUnitId: DWWCBannerAdUnit, size: AdSize.banner, listener: (MobileAdEvent event) { print("BannerAd event $event"); // 重点关注加载失败的事件,排查原因 if (event == MobileAdEvent.failedToLoad) { print("广告加载失败,可查看错误码定位问题"); } }, ); } @override void initState() { super.initState(); // 在Widget初始化后加载广告 _bannerAd = createBannerAd()..load()..show(); } @override void dispose() { // 销毁广告释放资源 _bannerAd?.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar(title: const Text('广告测试')), body: const Center(child: Text('Banner广告将显示在屏幕底部')), ), ); } }
额外注意事项
- 确保真机网络正常,且没有安装广告拦截类应用。
- 查看控制台的广告事件日志,特别是
failedToLoad事件,根据提示的错误码去AdMob官方文档查找对应原因。
内容的提问来源于stack exchange,提问作者GTG
相关产品推荐
相关产品推荐

