如何在LazyColumn中结合泛型使用Item的id作为key?
解决泛型LazyColumn用Item.id做key报错的问题
问题根源在于编译器不知道泛型T具备id属性,直接写T.id肯定会报错。给你两个实用的解决办法:
方法一:给泛型加接口约束
先定义一个带id的通用接口,让所有要放进LazyColumn的数据类都实现它:
interface HasId { val id: Long // 可根据实际需求改成String等其他类型 } // 你的数据类实现这个接口 data class User(override val id: Long, val name: String) : HasId data class Post(override val id: Long, val content: String) : HasId
然后在泛型LazyColumn的可组合函数里,给T加上这个接口约束:
@Composable fun <T : HasId> GenericLazyColumn( items: List<T>, itemContent: @Composable (T) -> Unit ) { LazyColumn { items(items, key = { it.id }) { item -> itemContent(item) } } }
这样编译器就能确定所有T类型的对象都有id属性,不会再抛出未解析引用的错误。
方法二:传入id提取Lambda(更灵活)
如果不想强制所有数据类都实现接口,就给可组合函数加个参数,专门用来提取每个Item的key:
@Composable fun <T> GenericLazyColumn( items: List<T>, keyExtractor: (T) -> Any, // 用Any兼容各种id类型 itemContent: @Composable (T) -> Unit ) { LazyColumn { items(items, key = { keyExtractor(it) }) { item -> itemContent(item) } } }
调用的时候直接传入提取id的逻辑就行:
GenericLazyColumn( items = userList, keyExtractor = { it.id }, itemContent = { UserItem(it) } )
这种方式更灵活,哪怕有的数据类id字段叫userId或者postId,直接传{ it.userId }就能用,不用修改数据类结构。
内容的提问来源于stack exchange,提问作者Raj Narayanan
相关产品推荐
相关产品推荐

