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

Flutter中Admob Banner报错:AdWidget需先调用Ad.load再插入组件树

Flutter Admob Banner 错误排查与修复

错误根源

  1. 未触发广告加载:你仅创建了BannerAd实例,但未调用banner.load()方法。Admob的AdWidget要求广告必须完成加载流程(即调用load()并触发onAdLoaded)后,才能被插入Widget树,这是报错的核心原因。
  2. 语法错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 05:07:13