PainterResource 抛出 IllegalArgumentException:仅支持 VectorDrawables 和光栅化资源类型

Fan*_*dez 11 android android-jetpack-compose coil

我正在开发一个 Jetpack 项目,该项目使用 Coil Library 从 API 下载图像。

我已确认 API 调用已成功返回有效的图像 URL 和相关数据。我可以使用返回的 URL 在浏览器上查看图像。

这是我的图像可组合项:

@Composable
fun AstroPhoto(picture: AstroPicture) {

    val imgUrl = picture.url.toUri()
            .buildUpon()
            .scheme("https")
            .build()
    
    AsyncImage(model = ImageRequest.Builder(LocalContext.current)
            .data(imgUrl)
            .size(Size.ORIGINAL)
            .crossfade(true).build(),

            placeholder = painterResource(R.drawable.loading_animation),
            contentDescription = picture.title,
            contentScale = ContentScale.Crop,
    )
}
Run Code Online (Sandbox Code Playgroud)

我将上面的图像称为可组合在惰性列中:

....
 Box( ... ) {
            
           LazyColumn(content = {
               
               items(state.astroPictures) {
               
                AstroPhoto(picture = it)
            } })
            
        }
Run Code Online (Sandbox Code Playgroud)

这是我得到的异常:

致命异常:主进程:com.uxstate,PID:31790 java.lang.IllegalArgumentException:仅支持 VectorDrawables 和光栅化资源类型。PNG、JPG 位于 androidx.compose.ui.res.PainterResources_androidKt.loadVectorResource(PainterResources.android.kt:93)

我正在compose_version = '1.1.1'kotlin_version = '1.6.10'. 我的线圈版本是"io.coil-kt:coil-compose:2.1.0"and compileSdk 32and AS Chipmunk。源代码可以在这里找到。

我已检查文档并在线搜索,但无法解决该错误。请帮我解决这个错误,谢谢。

小智 8

刚刚遇到这个错误,看看有没有人和我有同样的错误。

我刚刚重新打开 Android Studio,之后我使用 Clean Project 和 Rebuild Project。现在项目和撰写预览工作正常。


Jec*_*nly 6

我的项目之前工作正常,但是在我更改了一些代码之后(只需添加一个函数,它与 png 或 jpg 或其他有关图像的内容无关),我的应用程序在渲染 png 时崩溃。但是当我在模拟器中重新安装该项目后,它就被修复了。这似乎是 Compose 中的一个错误?我不知道,可能是gradle中的一个错误? 只需尝试重新安装您的应用程序,我认为它会得到修复。

  • 在“SHIFT x 2”对我有用之后,“与 Gradle 文件同步项目”。谢谢 :) (4认同)

alf*_*tap 4

这似乎是 Jetpack Compose 的错误

目前我已经能够在我自己的项目中通过使用 AndroidView 渲染 ImageView 来解决这个问题。

如果您需要异步加载图像,您可以渲染 Glide imageview 或类似的东西

fun AppImage(
    modifier: Modifier = Modifier,
    @DrawableRes resource: Int,
    colorFilter: ColorFilter? = null
) {
    AndroidView(
        modifier = modifier,
        factory = { context ->
        ImageView(context).apply {
            setImageResource(resource)
            setColorFilter(colorFilter?.asAndroidColorFilter())
        }
    },
        update = {
            it.setImageResource(resource)
            it.colorFilter = colorFilter?.asAndroidColorFilter()
        }
    )
}
Run Code Online (Sandbox Code Playgroud)