如何在jetpack compose的新线圈版本中使用`ImageRequest.Builder.target`?

问题描述 投票:0回答:3

我的摇篮

// Coil
implementation "io.coil-kt:coil-compose:1.4.0"

问题描述

以前我将线圈与 Google 的

accompanist
一起使用,但是当我迁移到新版本的线圈时如文档所示,我在使用
target
方法时遇到了问题:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.pokedex, PID: 13502
    java.lang.IllegalArgumentException: request.target must be null.
        at coil.compose.ImagePainterKt.rememberImagePainter(ImagePainter.kt:94)
...

线圈实施

当浏览

ImagePainter
(线圈类)的内部代码时,你可以看到
target
方法由于某种原因确实需要为null:

@Composable
fun rememberImagePainter(
     request: ImageRequest,
     imageLoader: ImageLoader,
     onExecute: ExecuteCallback = ExecuteCallback.Default,
): ImagePainter {
     requireSupportedData(request.data)
     require(request.target == null) { "request.target must be null." }
...

我的代码

这是我在 jetpack compose 中的组件(图像组件位于列内):

Image(
    modifier = Modifier
        .size(120.dp)
        .align(Alignment.CenterHorizontally),
    painter = rememberImagePainter(
        data = entry.imageUrl,
        builder = {
            crossfade(true)
            target {
                viewModel.calcDominantColor(it) { color ->
                    dominantColor = color
                }
            }
            transformations(CircleCropTransformation())
        },
    ),
    contentDescription = entry.pokemonName
)

我需要目标方法根据它作为参数传递的

viewModel
对我的
drawable
进行内部操作。有人可以帮助我吗?

android crash android-jetpack-compose coil
3个回答
6
投票

我知道你关注这个https://www.youtube.com/watch?v=jrIfGAk8PyQ&list=PLQkwcJG4YTCTimTCpEL5FZgaWdIZQuB7m&index=5 作者:菲利普·拉克纳 试试这个代码

AsyncImage(
            model = ImageRequest.Builder(LocalContext.current)
                .data(entry.imageUrl)
                .crossfade(true)
                .build(),
            contentDescription = entry.pokemonName,
            onSuccess = {
                viewModel.calcDominantColor(it.result.drawable) { color ->
                    dominantColor = color
                }
            },
            modifier = Modifier
                .size(120.dp)
                .align(CenterHorizontally)
        )

并使用此库实现(“io.coil-kt:coil-compose:2.2.2”) 以及更多信息https://coil-kt.github.io/coil/compose/


5
投票

在 Coil 2.0.0 中,

AsyncImage
rememberAsyncImagePainter
都有
onSuccess
回调参数,使用该参数可以获取可绘制对象,如下所示:

AsyncImage(
    model = imageURL,
    contentDescription = null,
    onSuccess = { success ->
        val drawable = success.result.drawable
    }
)

线圈1.4.0版本:

这是预期的行为,因为

rememberImagePainter
在内部设置了
target

您可以跟踪画家状态,等待

Success
并从中获取
drawable
。也可与
LaunchedEffect
一起使用以防止重新计算:

val painter = rememberImagePainter(
    data = imageUrl,
    builder = {
        ...
    },
)
(painter.state as? ImagePainter.State.Success)
    ?.let { successState ->
        LaunchedEffect(Unit) {
            val drawable = successState.result.drawable
            viewModel.calcDominantColor(drawable) { color ->
                dominantColor = color
            }
        }
    }
Image(
    painter = painter,
    contentDescription = "...",
    modifier = Modifier
        ...
)

0
投票

我也面临同样的问题

使用此实现

  • 首先,将此库实现到您的项目中

实现(“io.coil-kt:coil-compose:2.6.0”)或较新版本

  • 然后使用此代码-

        val imageModel = ImageRequest.Builder(LocalContext.current)
             .data(data = ImageUrl)
             .build()
    
         AsyncImage(
             model = imageModel,
             contentDescription = null,
             onSuccess = { it ->
                 val drawable = it.result.drawable
             }
         )
    
© www.soinside.com 2019 - 2024. All rights reserved.