gpt4 book ai didi

android - 如何在 Jetpack Compose 的新线圈版本中使用 `ImageRequest.Builder.target`?

转载 作者:行者123 更新时间:2023-12-02 18:28:12 25 4
gpt4 key购买 nike

我的 Gradle

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

问题描述

之前我用的是coil和Google的accompanist,但是当我迁移到新版本的coil时as the documentation suggests我在使用 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
)

我需要目标方法根据它作为参数传递的 drawable 对我的 viewModel 执行内部操作。有人可以帮助我吗?

最佳答案

在 Coil 2.0.0 中,AsyncImagerememberAsyncImagePainter 都有 onSuccess 回调参数,使用它你可以得到可绘制对象如下:

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

线圈1.4.0版本:

这是预期的行为,因为 rememberImagePainter 在内部设置了 target

您可以跟踪 painter 状态,等待 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
...
)

关于android - 如何在 Jetpack Compose 的新线圈版本中使用 `ImageRequest.Builder.target`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69818214/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com