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

Jetpack Compose用AndroidView加载Smart.IO广告横幅返回页面不重组问题

问题根因

AndroidView 仅在内部状态更新、或者外部绑定的依赖项发生变化时才会触发重组、执行update回调。你当前的实现没有给AndroidView绑定任何可变依赖,所以页面返回时不会触发更新逻辑,广告自然不会重新加载展示。

修复方案

你可以通过绑定页面生命周期关联的可变状态,来主动触发AndroidView的更新,具体实现分为两步:

步骤1:声明更新触发状态

在当前Composable作用域内声明可变状态,监听页面进入事件,每次页面进入时更新状态值:

// 声明可变状态作为更新触发键
val adRefreshKey = remember { mutableIntStateOf(0) }

// 监听当前Composable的生命周期,每次页面进入时更新键值
LaunchedEffect(Unit) {
    adRefreshKey.intValue += 1
}

步骤2:修改AndroidView实现

有两种可选实现方式,根据你的业务需求选择即可:

方式1:复用Banner实例,在update中刷新广告

Smart.IO的Banner实例自带广告加载方法,你可以在update回调中主动调用刷新:

AndroidView(
    modifier = Modifier.fillMaxWidth(),
    factory = { context ->
        Banner(context as Activity?).apply {
            // 首次创建时加载广告
            loadAd()
        }
    },
    update = { banner ->
        // 每次触发更新时重新加载广告
        banner.loadAd()
    }
)

如果多次调用loadAd会出现重复加载问题,也可以先调用销毁方法再重新加载:

update = { banner ->
    banner.destroy()
    banner.loadAd()
}

方式2:直接重建Banner实例

如果你不需要保留之前的Banner实例状态,也可以把触发状态作为key传入AndroidView,key变化时会自动销毁旧实例、重新创建新的Banner:

AndroidView(
    modifier = Modifier.fillMaxWidth(),
    key = adRefreshKey.intValue,
    factory = { context ->
        Banner(context as Activity?).apply {
            loadAd()
        }
    },
    update = {}
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 19:15:05