Jetpack Compose中Coil加载URL图片后如何正确获取Drawable执行逻辑
问题原因分析
1. 自定义Target未触发的原因
accompanist-coil的rememberCoilPainter方法内部会强制覆盖ImageRequest传入的target参数,用于内部更新Painter的绘制状态和加载进度,因此外部自定义的Target回调会被完全覆盖,无法接收到加载完成的回调。
2. Transformation重组不触发的原因
Coil会对Transformation的处理结果做缓存,缓存Key由Transformation的key()方法返回值 + 图片资源的唯一Key共同决定,只要Key没有发生变化,Coil就会直接复用缓存后的Bitmap,不会再次执行transform方法,因此Composable重组时你的自定义逻辑不会被触发。
正确实现方案
官方推荐通过监听rememberCoilPainter返回的Painter的加载状态来获取加载完成的Drawable,不受内部逻辑和缓存策略的影响,每次图片加载完成(无论是走本地缓存还是重新网络请求)都会触发回调:
val painter = rememberCoilPainter( request = imageUrl, fadeIn = true ) // 监听图片加载状态,加载成功后执行自定义逻辑 LaunchedEffect(painter.loadState) { if (painter.loadState is LoadState.Success) { val resultDrawable = (painter.loadState as LoadState.Success).result.drawable viewModel.calcDominantColor(resultDrawable) { color -> dominantColor = color } } } Image( painter = painter, contentDescription = "Some Image" )
如果需要自定义逻辑的触发时机,只需要调整LaunchedEffect的依赖参数即可:
- 如果仅需要在图片URL变化后重新执行逻辑,修改为
LaunchedEffect(imageUrl, painter.loadState) - 如果需要每次Composable重组都重新执行逻辑,移除所有依赖参数改为
LaunchedEffect(Unit)
内容的提问来源于stack exchange,提问作者Md Azharuddin
相关产品推荐
相关产品推荐

