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

升级依赖后Jetpack Compose中Paging3 LazyColumn参数报错问题

解决Jetpack Compose Paging3升级后LazyColumn items报错问题

问题原因

升级Jetpack Compose与Paging3到最新版本后,LazyPagingItems对应的items扩展函数API发生变更:key选择器的参数变为可空类型(UnsplashImage?),原代码直接访问unsplashImage.id会因空值触发编译或运行时错误。

解决方案

1. 修复key选择器的空值处理

修改ListContent中items的key参数,处理item为空的情况:

@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 ->
                // 优先使用item的id作为key,为空时生成唯一临时key保证稳定性
                unsplashImage?.id ?: rememberSaveable { UUID.randomUUID().toString() }
            }
        ) { unsplashImage ->
            unsplashImage?.let { UnsplashItem(unsplashImage = it) }
        }
    }
}

如果确认分页过程中不会出现空item(例如关闭了占位符功能),也可以使用非空断言简化,但不推荐在通用场景使用:

key = { unsplashImage ->
    checkNotNull(unsplashImage).id
}

2. 适配Coil最新API(可选)

如果使用的是Coil 2.x及以上版本,rememberAsyncImagePainter已被标记为过时,建议替换为官方推荐的AsyncImage组件,简化图片加载逻辑:

@ExperimentalCoilApi
@Composable
fun UnsplashItem(unsplashImage: UnsplashImage) {
    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
    ) {
        // 替换原手动创建painter的逻辑
        AsyncImage(
            model = unsplashImage.urls.regular,
            placeholder = painterResource(id = R.drawable.ic_placeholder),
            error = painterResource(id = R.drawable.ic_placeholder),
            contentDescription = "Unsplash Image",
            modifier = Modifier.fillMaxSize(),
            contentScale = ContentScale.Crop
        )
        // 其余代码保持不变...
    }
}

内容的提问来源于stack exchange,提问作者Dr Mido

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 14:55:08