In this demo app, I've implemented paging3 with jetpack compose, but in ListContent I got this error after updating the all dependencies to the latest version, I try to pass items and the key as unsplashImage.id
it's look the lazyColumn in newer version has different params
this my ListContent file
@ExperimentalCoilApi
@Composable
fun ListContent(items: LazyPagingItems<UnsplashImage>) {
Log.d("Error", items.loadState.toString())
LazyColumn(
modifier = Modifier.fillMaxSize(),
contentPadding = PaddingValues(all = 12.dp),
verticalArrangement = Arrangement.spacedBy(12.dp)
) {
items(
items = items,
key = { unsplashImage ->
unsplashImage.id
}
) { unsplashImage ->
unsplashImage?.let { UnsplashItem(unsplashImage = it) }
}
}
}
@ExperimentalCoilApi
@Composable
fun UnsplashItem(unsplashImage: UnsplashImage) {
val painter = rememberAsyncImagePainter(
model = unsplashImage.urls.regular,
error = painterResource(id = R.drawable.ic_placeholder),
placeholder = painterResource(id = R.drawable.ic_placeholder)
)
val context = LocalContext.current
Box(
modifier = Modifier
.clickable {
val browserIntent = Intent(
Intent.ACTION_VIEW,
Uri.parse("https://unsplash.com/@${unsplashImage.user.username}?utm_source=DemoApp&utm_medium=referral")
)
ContextCompat.startActivity(context, browserIntent, null)
}
.height(300.dp)
.fillMaxWidth(),
contentAlignment = Alignment.BottomCenter
) {
Image(
modifier = Modifier.fillMaxSize(),
painter = painter,
contentDescription = "Unsplash Image",
contentScale = ContentScale.Crop
)
Surface(
modifier = Modifier
.height(40.dp)
.fillMaxWidth()
.alpha(0.5F),
color = Color.Black
) {}
Row(
modifier = Modifier
.height(40.dp)
.fillMaxWidth()
.padding(horizontal = 6.dp),
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.SpaceBetween
) {
Text(
text = buildAnnotatedString {
append("Photo by ")
withStyle(style = SpanStyle(fontWeight = FontWeight.Black)) {
append(unsplashImage.user.username)
}
append(" on Unsplash")
},
color = Color.White,
fontSize = MaterialTheme.typography.titleSmall.fontSize,
maxLines = 1,
overflow = TextOverflow.Ellipsis
)
LikeCounter(
modifier = Modifier.weight(3f),
painter = painterResource(id = R.drawable.ic_heart),
likes = "${unsplashImage.likes}"
)
}
}
}
@Composable
fun LikeCounter(
modifier: Modifier,
painter: Painter,
likes: String
) {
Row(
modifier = modifier.fillMaxSize(),
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.End
) {
Icon(
painter = painter,
contentDescription = "Heart Icon",
tint = HeartRed
)
Divider(modifier = Modifier.width(6.dp))
Text(
text = likes,
color = Color.White,
fontSize = MaterialTheme.typography.titleLarge.fontSize,
fontWeight = FontWeight.Bold,
maxLines = 1,
overflow = TextOverflow.Ellipsis
)
}
}
@ExperimentalCoilApi
@Composable
@Preview
fun UnsplashImagePreview() {
UnsplashItem(
unsplashImage = UnsplashImage(
id = "1",
urls = Urls(regular = ""),
likes = 100,
user = User(username = "Midomidoman", userLinks = UserLinks(html = ""))
)
)
}
and the model
@Serializable
@Entity(tableName = UNSPLASH_IMAGE_TABLE)
data class UnsplashImage(
@PrimaryKey(autoGenerate = false)
val id: String,
@Embedded
val urls: Urls,
val likes: Int,
@Embedded
val user: User
)
As explained in the Paging Compose 1.0.0-alpha19 release notes, the Paging Compose API was changed to support any kind of lazy layout (instead of just LazyColumn
and LazyRow
). This means you use the normal items
method that takes a item count and the new itemKey
extension method on LazyPagingItems
.
So you should follow the updated Paging Compose guide to write your LazyColumn
as:
LazyColumn(
modifier = Modifier.fillMaxSize(),
contentPadding = PaddingValues(all = 12.dp),
verticalArrangement = Arrangement.spacedBy(12.dp)
) {
items(
items.itemCount,
key = lazyPagingItems.itemKey { unsplashImage ->
unsplashImage.id
}
) { index ->
items[index]?.let { UnsplashItem(unsplashImage = it) }
}
}