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

Compose中Coil加载Firebase存储图片失败:无支持的Fetcher

解决Jetpack Compose中Coil加载Firebase Storage图片失败的问题

报错Unable to fetch data. No fetcher supports: gs://的核心原因是普通Coil的默认ImageLoader不支持Firebase Storage的gs://协议和StorageReference类型,而传统View体系中你用了FireCoil.loader(context)(即FirestoreLoader),它内置了处理这类资源的Fetcher。以下是具体解决步骤:

1. 确保引入FireCoil依赖

在模块级build.gradle(或build.gradle.kts)中添加FireCoil依赖,注意要和Coil Compose的版本保持一致:

dependencies {
    // Coil Compose核心依赖(版本请根据实际情况调整)
    implementation 'io.coil-kt:coil-compose:2.5.0'
    // FireCoil扩展,用于支持Firebase Storage资源加载
    implementation 'io.coil-kt:coil-firestore:2.5.0'
}

2. 在Compose中使用FirestoreLoader加载图片

替换默认的rememberImagePainter,改用FireCoil提供的FirestoreLoader来构建图片加载器,示例代码如下:

import coil.firestore.FirestoreLoader
import coil.compose.rememberAsyncImagePainter
import coil.request.ImageRequest
import android.util.Log
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Modifier
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.runtime.Composable
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp
import com.google.firebase.storage.FirebaseStorage

@Composable
fun FirebaseStorageImage() {
    val context = LocalContext.current
    // 初始化FirestoreLoader
    val firestoreLoader = remember { FirestoreLoader(context) }
    
    Image(
        modifier = Modifier.size(100.dp).padding(16.dp),
        painter = rememberAsyncImagePainter(
            model = FirebaseStorage.getInstance().getReference("<Redacted>"),
            imageLoader = firestoreLoader,
            builder = {
                crossfade(false)
                placeholder(getShimmerPlaceholder())
                listener(object : ImageRequest.Listener {
                    override fun onError(request: ImageRequest, throwable: Throwable) {
                        super.onError(request, throwable)
                        Log.e("CoilRequest", "${throwable.message}")
                    }
                })
            }
        ),
        contentDescription = "Firebase storage image",
        contentScale = ContentScale.Fit
    )
}

关键说明

  • 传统View体系中你调用FireCoil.loader(context)获取的就是FirestoreLoader,它注册了专门处理StorageReference和gs://协议的Fetcher。
  • Compose默认的rememberImagePainter使用的是Coil的默认ImageLoader,没有包含Firebase相关的Fetcher,因此必须显式指定imageLoader = firestoreLoader。

内容的提问来源于stack exchange,提问作者z.g.y

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 02:09:09