Android Kotlin Jetpack项目Glide加载空图片URL时占位图不显示问题
问题根因
- 你当前在MovieCard中使用了
movie.posterPath?.let逻辑,当海报URL为null时,整个let代码块不会执行,连Image组件都不会渲染,自然只会展示标题部分,卡片高度收缩。 - 你现有
loadPicture函数的入参url是不可空类型,天然不支持null的场景,且没有处理Glide加载失败的回调逻辑,也会导致异常场景下图片无法展示。
修复方案
第一步:修改MovieCard的图片渲染逻辑
去掉?.let的空过滤,把可空的posterPath直接传给图片加载函数:
// 删掉?.let的空判断,不管posterPath是否为空都执行加载逻辑 val image = loadPicture(url = movie.posterPath, defaultImage = DEFAULT_MOVIE_IMAGE).value image?.let { img -> Image( bitmap = img.asImageBitmap(), contentDescription = "Movie Projector", modifier = Modifier .fillMaxWidth() .height(450.dp), contentScale = ContentScale.Fit ) }
第二步:修改ImageUtils.kt的loadPicture函数
把url入参改为可空类型,增加空url判断、加载失败回调处理:
const val DEFAULT_MOVIE_IMAGE = R.drawable.movie_placeholder const val POSTER_BASE_URL = "https://image.tmdb.org/t/p/w500" @Composable fun loadPicture( url: String?, // 修改为可空类型 @DrawableRes defaultImage: Int ): MutableState<Bitmap?> { val bitmapState: MutableState<Bitmap?> = remember { mutableStateOf(null) } // 先加载默认图到状态 Glide.with(LocalContext.current) .asBitmap() .load(defaultImage) .into(object : CustomTarget<Bitmap>() { override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) { bitmapState.value = resource } override fun onLoadCleared(placeholder: Drawable?) {} }) // url为空的话直接返回默认图,不发起网络请求 if (url.isNullOrEmpty()) return bitmapState // url不为空才发起网络请求 Glide.with(LocalContext.current) .asBitmap() .load("$POSTER_BASE_URL$url") .error(R.drawable.space_dog_laika1) .into(object : CustomTarget<Bitmap>() { override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) { bitmapState.value = resource } // 增加加载失败的回调,加载失败时保留默认图即可 override fun onLoadFailed(errorDrawable: Drawable?) { super.onLoadFailed(errorDrawable) // 如果需要展示error图也可以在这里替换bitmapState的值 } override fun onLoadCleared(placeholder: Drawable?) {} }) return bitmapState }
效果说明
修改后不管海报URL是否为空,都会先渲染默认占位图,URL有效且加载成功后再替换为网络海报,加载失败或者URL为空的场景都会保留默认图展示,卡片高度也会保持450dp不会收缩。
内容的提问来源于stack exchange,提问作者petestmart
相关产品推荐
相关产品推荐

