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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 07:15:01