Paul
11/14/2021, 9:43 PMPaul
11/14/2021, 9:45 PM@Composable
fun GameCover(
title: String,
imageUrl: String?,
modifier: Modifier,
onCoverClicked: () -> Unit
) {
Card(
modifier = modifier.clickable(onClick = onCoverClicked)
) {
Box {
var isTitleVisible by remember { mutableStateOf(true) }
Image(
painter = if (imageUrl == null) {
painterResource(R.drawable.game_cover_placeholder)
} else {
rememberImagePainter(
data = imageUrl,
builder = {
placeholder(R.drawable.game_cover_placeholder)
error(R.drawable.game_cover_placeholder)
crossfade(durationMillis = 5000) // 5000 just for testing
listener(
onStart = { isTitleVisible = true },
onSuccess = { _, _ -> isTitleVisible = false },
onError = { _, _ -> isTitleVisible = true }
)
}
)
},
contentDescription = null,
modifier = Modifier.matchParentSize(),
contentScale = ContentScale.Crop,
)
if (isTitleVisible) {
Text(
text = title,
modifier = Modifier.align(Alignment.Center),
color = colorResource(R.color.game_cover_title_text_color),
)
}
}
}
}
Paul
11/14/2021, 9:48 PMisTitleVisible
field inside Coil's listener methods (onStart
, onSuccess
, onError
), two things happen: crossfade effect stops working as well as I believe this causes infinite recompositions (I've put some Log
method calls inside builder
lambda and in the logcat it's printed infinitely).Paul
11/14/2021, 10:00 PMlistener
method from the builder
lambda, the crossfade starts working again as well as logcat does not print the log from the builder
lambda indefinitely.Paul
11/14/2021, 10:01 PMAlbert Chang
11/15/2021, 2:27 AMisTitleVisible
. You can use something like:
val painter = if (imageUrl == null) {
painterResource(R.drawable.game_cover_placeholder)
} else {
rememberImagePainter(
data = imageUrl,
builder = {
placeholder(R.drawable.game_cover_placeholder)
error(R.drawable.game_cover_placeholder)
crossfade(durationMillis = 5000) // 5000 just for testing
}
)
}
Image(
painter = painter,
contentDescription = null,
modifier = Modifier.matchParentSize(),
contentScale = ContentScale.Crop,
)
if (painter is ImagePainter && painter.state is ImagePainter.State.Success) {
Text(
text = title,
modifier = Modifier.align(Alignment.Center),
color = colorResource(R.color.game_cover_title_text_color),
)
}
Albert Chang
11/15/2021, 2:28 AMCard(onClick = {})
overload instead of clickable
modifier.Paul
11/15/2021, 9:32 AMPaul
11/15/2021, 5:30 PMImagePainter.state
field. Thanks.