You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Kotlin Jetpack项目Glide加载空图片URL时占位图不显示问题

问题根因

  1. 你当前在MovieCard中使用了movie.posterPath?.let逻辑,当海报URL为null时,整个let代码块不会执行,连Image组件都不会渲染,自然只会展示标题部分,卡片高度收缩。
  2. 你现有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 23:54:03