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
相关产品推荐
相关产品推荐

