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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 03:42:45