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

如何解决Flutter中flutter_native_admob广告在ListView重复加载问题?

我遇到过类似的坑,虽然严格按照文档共享了NativeAdmobController,但滚动时广告还是重复加载,主要是ListView组件的生命周期和不必要的build触发导致的,给你几个实用的解决方向:

1. 给广告组件添加状态保持,避免滚动时重建

ListView滚动时,不在视口内的组件会被系统销毁,再次滚回时会重新build,这就导致广告重复加载。给你的广告组件加上AutomaticKeepAliveClientMixin可以强制保持组件状态:

修改NativeBannerAds的State:

class _NativeBannerAdsState extends State<NativeBannerAds> with AutomaticKeepAliveClientMixin {
  @override
  bool get wantKeepAlive => true; // 开启状态保持

  @override
  Widget build(BuildContext context) {
    super.build(context); // 必须调用这行,否则状态保持不生效
    return Container(
      // 你的原有容器代码
    );
  }
}

同样给NativeFullAds的State做相同修改:

class _NativeFullAdsState extends State<NativeFullAds> with AutomaticKeepAliveClientMixin {
  @override
  bool get wantKeepAlive => true;

  @override
  Widget build(BuildContext context) {
    super.build(context);
    return Container(
      // 你的原有容器代码
    );
  }
}

2. 规范管理Controller的生命周期

确保Controller在父组件初始化时预加载广告,并且在页面销毁时释放资源,避免内存泄漏和异常:

修改_ActivityPageState:

@override
void initState() {
  super.initState();
  controller.loadAd(); // 提前预加载广告,避免组件build时才开始请求
}

@override
void dispose() {
  controller.dispose(); // 页面销毁时释放控制器资源
  super.dispose();
}

3. 减少父组件不必要的build触发

你的父组件中使用了Provider.of<PaymentProvider>(context),默认listen: true,这意味着只要PaymentProvider状态变化,整个父组件就会重新build,广告组件也会跟着执行build方法。如果只是判断订阅状态不需要实时监听,可以改成:

PaymentProvider paymentProvider = Provider.of<PaymentProvider>(context, listen: false);

如果确实需要实时监听订阅状态,保持listen: true即可,但结合前面的AutomaticKeepAliveClientMixin,广告组件不会因为build重新加载广告。

4. 检查组件版本

有时候组件的旧版本bug也会导致这种问题,确认你使用的flutter_native_admob是最新稳定版,或者去官方仓库看看有没有类似问题的解决方案。

内容的提问来源于stack exchange,提问作者rahul Kushwaha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 19:02:52