Flutter ironSource插件报loadBanner重复调用错误 如何销毁Banner广告
你遇到的can't load banner - loadBanner already called and still in progress错误,本质是SDK检测到前一次Banner加载请求未完成时,重复触发了加载逻辑导致的,和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
相关产品推荐
相关产品推荐

