// 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
进行内部操作。有人可以帮助我吗?
我知道你关注这个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/
在 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
...
)
我也面临同样的问题
使用此实现
实现(“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
}
)