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

Flutter ironSource插件报loadBanner重复调用错误 如何销毁Banner广告

你遇到的can't load banner - loadBanner already called and still in progress错误,本质是SDK检测到前一次Banner加载请求未完成时,重复触发了加载逻辑导致的,和Banner生命周期管理不当、缺少加载状态拦截有关。

一、Flutter中销毁/释放ironSource Banner广告的方法

你当前代码里设置了keepAlive: true,该属性会让Banner组件在页面销毁时不自动释放资源,导致页面重建时旧的加载请求还在执行,同时触发新的加载请求,就会抛出对应报错。你可以通过两种方式处理销毁逻辑:

  • 如果你不需要跨页面保留Banner,直接将keepAlive属性改为false,插件会在Banner组件所在页面销毁时自动调用销毁逻辑,释放所有Banner相关资源,不会残留未完成的加载请求。
  • 如果你需要手动控制销毁时机,可以在页面的dispose生命周期中主动调用SDK提供的销毁方法,示例如下:
@override
void dispose() {
  // 手动销毁Banner广告
  IronSource.destroyBanner();
  super.dispose();
}
二、通过监听器类解决重复加载问题

你可以在现有监听器中增加加载状态标记,拦截重复的加载请求,修改后的监听器代码如下:

class IronBannerAdListener extends IronSourceBannerListener {
  // 标记当前是否有Banner正在加载中
  bool isBannerLoading = false;

  @override
  void onBannerAdLoadFailed(Map<String, dynamic> error) {
    print("onBannerAdLoadFailed");
    // 加载失败后重置状态,允许后续重新加载
    isBannerLoading = false;
  }

  @override
  void onBannerAdLoaded() {
    print("onBannerAdLoaded");
    // 加载成功后重置状态
    isBannerLoading = false;
  }

  // 其余原有回调保持不变即可
  @override
  void onBannerAdClicked() {
    print("onBannerAdClicked");
  }

  @override
  void onBannerAdLeftApplication() {
    print("onBannerAdLeftApplication");
  }

  @override
  void onBannerAdScreenDismissed() {
    print("onBannerAdScreenDismisse");
  }

  @override
  void onBannerAdScreenPresented() {
    print("onBannerAdScreenPresented");
  }
}

之后将监听器实例作为页面State的成员变量存储,不要每次在build方法中新建实例,在所有触发Banner加载的逻辑前增加状态判断:

class YourPageState extends State<YourPage> {
  // 存储监听器实例,避免重复创建
  final IronBannerAdListener _bannerListener = IronBannerAdListener();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      bottomNavigationBar: IronSourceBannerAd(
        keepAlive: false,
        listener: _bannerListener,
      ),
      // 其余页面代码
    );
  }

  // 手动触发Banner加载的方法示例
  void triggerBannerLoad() {
    // 仅当没有正在加载的Banner时才触发新的加载请求
    if (!_bannerListener.isBannerLoading) {
      _bannerListener.isBannerLoading = true;
      IronSource.loadBanner();
    }
  }

  @override
  void dispose() {
    IronSource.destroyBanner();
    super.dispose();
  }
}
注意事项
  • 不要在build方法中每次都新建IronBannerAdListener实例,否则状态标记会失效。
  • 如果多页面共用Banner,不要重复初始化Banner组件,统一在根页面或全局状态中管理Banner的加载、销毁逻辑即可。

内容的提问来源于stack exchange,提问作者Radiant Developers

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 17:54:05