Coil Compose加载本地drawable时painter.state始终为Empty如何解决
问题根因
你当前的写法存在逻辑死循环:Coil的ImagePainter必须被Image组件挂载到Compose树中才会触发图片加载流程,你只有在painter.state为Success时才创建Image组件,加载流程永远无法启动,所以painter.state会一直停留在Empty状态。
解决方案
优先推荐使用Coil官方封装的AsyncImage组件,内置状态监听逻辑,无需手动判断状态:
AsyncImage( model = DRAWABLE_RESOURCE_ID, contentDescription = null, contentScale = ContentScale.Fit, modifier = Modifier .padding(8.dp) .size(84.dp) .clip(RoundedCornerShape(16.dp)), // 加载中占位 loading = { Box(contentAlignment = Alignment.Center, modifier = Modifier.fillMaxSize()) { CircularProgressIndicator() } }, // 加载失败回调 onError = { Timber.e("Error") // 可在这里添加错误占位图逻辑 } )
如果你需要保留手动监听状态的写法,调整逻辑让Image始终持有painter触发加载即可,可通过透明度控制显示隐藏:
// 注意:新版Coil已废弃rememberImagePainter,推荐使用rememberAsyncImagePainter val painter = rememberAsyncImagePainter(DRAWABLE_RESOURCE_ID) Box( modifier = Modifier .padding(8.dp) .size(84.dp), contentAlignment = Alignment.Center ) { // Image始终挂载,触发加载流程 Image( painter = painter, contentDescription = null, contentScale = ContentScale.Fit, modifier = Modifier .fillMaxSize() .clip(RoundedCornerShape(16.dp)) // 加载成功前隐藏 .alpha(if (painter.state is ImagePainter.State.Success) 1f else 0f) ) when (painter.state) { is ImagePainter.State.Loading -> { CircularProgressIndicator() } is ImagePainter.State.Error -> { Timber.e("Error") } else -> {} } }
附加检查项
- 确认项目已引入
io.coil-kt:coil-compose依赖,且版本和项目Compose编译版本兼容 - 如果未引入
coil-startup依赖,需要在Application的onCreate中手动初始化Coil:Coil.setImageLoader(ImageLoader(context)) - 确认加载的drawable资源ID正确,未被资源混淆或裁剪删除
内容的提问来源于stack exchange,提问作者es0329
相关产品推荐
相关产品推荐

