Flutter:如何避免视图已销毁时仍显示横幅广告
解决firebase_admob横幅广告异步展示时的视图已关闭问题
你遇到的这个问题确实很常见——因为load()是异步操作,当用户快速返回退出页面时,Widget已经执行了dispose(),但之前发起的load()回调还在排队执行,这时候调用show()就会触发错误。
这里有几个实用的解决思路,帮你避免这种情况:
- 添加挂载状态标记:在Widget中维护一个
_isMounted布尔变量,用来追踪当前Widget是否还处于挂载状态。- 在
initState()中把_isMounted设为true - 在
dispose()中把_isMounted设为false,同时确保销毁广告实例
- 在
- 在异步回调中先判断挂载状态:只有当Widget还挂载着的时候,再执行
show()操作
修改后的代码示例如下:
bool _isMounted = false; BannerAd? _bannerAd; @override void initState() { super.initState(); _isMounted = true; _loadBannerAd(); } void _loadBannerAd() { _bannerAd = createBannerAd(); _bannerAd?.load().then((loaded) { // 先判断Widget是否还挂载,再展示广告 if (loaded && _isMounted) { _bannerAd?.show(); } }); } @override void dispose() { _isMounted = false; // 确保销毁广告实例,避免内存泄漏 _bannerAd?.dispose(); _bannerAd = null; super.dispose(); }
另外还有个小细节:建议把广告的创建和加载逻辑抽成单独的方法(比如上面的_loadBannerAd()),让代码更清晰,也方便后续维护。
内容的提问来源于stack exchange,提问作者areiser
相关产品推荐
相关产品推荐

