Flutter中Admob Banner报错:AdWidget需先调用Ad.load再插入组件树
错误根源
- 未触发广告加载:你仅创建了
BannerAd实例,但未调用banner.load()方法。Admob的AdWidget要求广告必须完成加载流程(即调用load()并触发onAdLoaded)后,才能被插入Widget树,这是报错的核心原因。 - 语法错误:
BannerAdListener的回调函数存在格式问题——箭头=>后无逻辑代码、回调间缺少逗号分隔,会导致编译失败,同时无法正确监听广告状态。
修复后的代码
class GoogleAdMob { static BannerAd loadBannerAd() { final banner = BannerAd( adUnitId: globals.admobAdUnitIdBanner!, size: AdSize.banner, request: const AdRequest(), listener: BannerAdListener( onAdLoaded: (Ad ad) { // 可选:广告加载完成后执行的逻辑,比如更新UI状态 }, onAdFailedToLoad: (Ad ad, LoadAdError error) { ad.dispose(); print('Banner加载失败: ${error.message}'); }, onAdOpened: (Ad ad) {}, onAdClosed: (Ad ad) {}, onAdImpression: (Ad ad) {}, ), ); // 关键步骤:调用load()触发广告加载 banner.load(); return banner; } static Container showBannerAd(BannerAd banner) { return Container( alignment: Alignment.center, width: banner.size.width.toDouble(), height: banner.size.height.toDouble(), child: AdWidget(ad: banner), ); } }
优化建议
- 避免提前渲染
AdWidget:建议通过FutureBuilder或维护一个isAdLoaded状态变量,仅在onAdLoaded回调触发后,才将showBannerAd返回的容器插入Widget树。 - 及时释放资源:在页面销毁时调用
banner.dispose(),防止内存泄漏。
内容的提问来源于stack exchange,提问作者Snap_Lan
相关产品推荐
相关产品推荐

