在 LazyColumn 中离开屏幕时,AdManagerAdView 不呈现广告图像

AdManagerAdView not rendering ad image when off screen in LazyColumn

我将 AdManagerAdView 包装在 AndroidView 中,以便我可以在 Jetpack Compose 中使用它。当我在 LazyColumn 中使用图像时图像无法加载并且 AdManagerAdView 尝试在可组合项出现在屏幕上之前加载图像。

如果我快速滚动到该元素,那么 LazyColumn 会合成它并且它会在图像从广告服务器返回之前显示在屏幕上,它会按预期工作。

LazyColumn {
        items(5) {
            SomeOtherComposable(it)
        }

        item {
            AndroidView(
                modifier = Modifier
                    .width(300.dp)
                    .height(250.dp)
                    .background(Color.Green),
                factory = { context ->
                    val adView = AdManagerAdView(context)
                    adView.adSize = AdSize.MEDIUM_RECTANGLE
                    adView.adUnitId = adUnitId
                    adView.loadAd(Builder().build())
                    adView
                }
            )
        }

        items(5) {
            SomeOtherComposable(it)
        }
}

出于演示目的...

@Composable
fun SomeOtherComposable(i: Int) {
    Text(
        text = "SomeOtherComposable $i",
        modifier = Modifier
            .fillMaxWidth()
            .height(320.dp)
            .background(Color.White)
    )
}

如果包装的 AdManagerAdView 用于 非惰性 列或任何其他 Compose 布局,这也可以正常工作。

这在 LazyColumn 中感觉像是一个奇怪的计时事件,它恰好在可组合项未出现在屏幕上时出现,因为在常规列中使用它在相同情况下工作正常。

有没有人经历过这样的事情?

已解决 请参阅下面我的回答

好的,问题实际上是 factory{}update{} 在 AndroidView 通过布局通道之前被调用。在我的重现步骤中,广告图像在测量宽度和高度之前返回并添加到内部视图。

解决方案是使用 doOnLayout{} 将加载调用延迟到布局通过之后,如下所示:

AndroidView(
        modifier = Modifier
            .width(300.dp)
            .height(250.dp)
            .background(Color.Green),
        factory = { context ->
            val adView = AdManagerAdView(context)
            adView.adSize = AdSize.MEDIUM_RECTANGLE
            adView
        },
        update = { adView ->
            adView.adUnitId = adUnitId
            adView.doOnLayout {
                adView.loadAd(Builder().build())
            }
        }
    )