Admob横幅广告仅在initState中打断点时才展示问题求助
问题根源
你代码的执行时序存在错误:广告加载逻辑写在initState中会在页面初始化时立即执行,但此时MobileAds SDK的初始化逻辑是放在FutureBuilder中异步执行的,SDK未完成初始化就调用_bannerAd.load()会导致广告加载直接失败。加断点时会阻塞代码执行,给SDK留出了初始化完成的时间,所以断点场景下广告可以正常加载。
解决方案
1. 提前初始化广告SDK
将SDK初始化逻辑移到应用启动阶段,保证进入页面前SDK已完成初始化:
void main() async { WidgetsFlutterBinding.ensureInitialized(); // 等待广告SDK初始化完成再启动应用 await MobileAds.instance.initialize(); runApp(const MyApp()); }
2. 删除冗余的FutureBuilder封装
SDK已经提前初始化完成,无需在页面组件中再嵌套异步初始化逻辑,直接改造页面构建逻辑即可:
@override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(widget.title), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ if (_isBannerAdReady) Align( alignment: Alignment.topCenter, child: SizedBox( width: _bannerAd.size.width.toDouble(), height: _bannerAd.size.height.toDouble(), child: AdWidget(ad: _bannerAd), ), ), const Text("Here goes the rest of the app"), ], ), ), ); }
原来的buildAdWidget方法和_initGoogleMobileAds方法可以直接删除。
额外校验项
如果修改后仍有问题,可以先检查控制台是否输出onAdFailedToLoad对应的错误日志,核对广告测试ID是否配置正确,Android/iOS端的广告相关权限、元数据配置是否符合要求。
内容的提问来源于stack exchange,提问作者D. Joe
相关产品推荐
相关产品推荐

