I'm trying to follow an online course to fetch images from Unsplash to view these images inside a LazyColumn, and I also followed all guidelines inside Unsplash Documentation. But the images or other data inside the LazyColumn are not showing. Only the app bar and background are visible. I will add below some code for clarification.
build.gradle (:app-side) to get API_KEY from "properties".
val properties = Properties()
try {
properties.load(FileInputStream(rootProject.file("gradle.properties")))
} catch (e: Exception) {
logger.warn("Properties not Found!")
}
android {
defaultConfig {
----
buildConfigField("String", "API_KEY", "" + properties["API_KEY"])
}
}
//UnsplashAPI.kt
interface UnsplashApi {
@Headers("Authorization: Client-ID ${BuildConfig.API_KEY}")
@GET("/photos")
suspend fun getAllImages(
@Query("page") page: Int,
@Query("per_page") perPage: Int
): List<UnsplashImage>
@Headers("Authorization: Client-ID ${BuildConfig.API_KEY}")
@GET("/search/photos")
suspend fun searchImages(
@Query("query") query: String,
@Query("per_page") perPage: Int
): List<UnsplashImage>
}
ListContent.kt
@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(count = items.itemCount,
key = items.itemKey { unsplashImage ->
unsplashImage.id
}
) { index ->
items[index]?.let { UnsplashItem(unsplashImage = it) }
}
}
}
@ExperimentalCoilApi
@Composable
fun UnsplashItem(unsplashImage: UnsplashImage) {
val painter = rememberAsyncImagePainter(
model = ImageRequest.Builder(LocalContext.current)
.data(unsplashImage.urls.regular)
.crossfade(durationMillis = 1000)
.error(R.drawable.ic_placeholder)
.placeholder(R.drawable.ic_placeholder).build())
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")
)
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(ContentAlpha.medium),
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 = 15.sp,
maxLines = 1,
overflow = TextOverflow.Ellipsis
)
LikeCounter(
modifier = Modifier.weight(3f),
painter = painterResource(id = R.drawable.ic_heart),
likes = "${unsplashImage.likes}"
)
}
}
}
HomeScreen.kt
@OptIn(ExperimentalCoilApi::class)
@Composable
fun HomeScreen(navController: NavHostController,
homeViewModel: HomeViewModel = hiltViewModel()
) {
val getAllImages = homeViewModel.getAllImages.collectAsLazyPagingItems()
Scaffold(
topBar = {
HomeTopBar(onSearchClicked = {
navController.navigate(Screen.Search.route)
})
},
content = {
Column(modifier = Modifier.padding(paddingValues = it)) {}
ListContent(items = getAllImages)
}
)
}
Thank you.
Well, after a simple search in my code, I realized that I forgot to add this annotation: @SerialName("The Actual Parameter Name In Your Json File"), if the used name is different.