用于 Jetpack Compose 中分页项目的 LazyVerticalGrid
LazyVerticalGrid for paging items in jetpack compose
我目前通过下面的扩展功能在 LazyVerticalGrid
中使用分页项 (LazyPagingItems
),它工作正常。
inline fun <T : Any> LazyGridScope.items(
items: LazyPagingItems<T>,
crossinline itemContent: @Composable LazyGridItemScope.(item: T?) -> Unit
) {
items(count = items.itemCount) { index ->
itemContent(items[index])
}
}
但是,我想利用 LazyLazyout
提供的其他参数,例如 key
、span
等,并尝试了以下功能。
inline fun <T : Any> LazyGridScope.items(
items: LazyPagingItems<T>,
noinline key: ((item: T?) -> Any)? = null,
noinline span: (LazyGridItemSpanScope.(item: T?) -> GridItemSpan)? = null,
noinline contentType: (item: T?) -> Any? = { null },
crossinline itemContent: @Composable LazyGridItemScope.(item: T?) -> Unit
) = items(
count = items.itemCount,
key = if (key != null) { index: Int -> key(items[index]) } else null,
span = if (span != null) { { span(items[it]) } } else null,
contentType = { index: Int -> contentType(items[index]) }
) {
itemContent(items[it])
}
当我将该函数与 key
一起使用时,它显示 Type mismatch: inferred type is Long? but Any was expected
.
错误
items(items = products, key = { product -> product?.productId }) {
//Content
}
我猜这是由于 public class LazyPagingItems<T : Any>
的声明。我如何解决它以将所有参数与分页项目一起使用?
对于 product?.productId
,您试图传递一个可选的 Int?
值,而 key
需要一个 non-optional Any
值。
当您将 key = null
传递给计算块时,它会根据索引为每个对象创建一个唯一的键。一个特定的项目键不能是 null
,因为那样会使它等于其他项目键,这是被禁止的。
您只能为非可选项目调用key
,并提供index
作为可选案例的默认值:
inline fun <T : Any> LazyGridScope.items(
// ...
noinline key: ((item: T) -> Any)? = null,
// ...
) = items(
// ...
key = if (key != null) { index: Int -> items[index]?.let(key) ?: index } else null,
// ...
用法:
items(items = products, key = { product -> product.productId }) {
我目前通过下面的扩展功能在 LazyVerticalGrid
中使用分页项 (LazyPagingItems
),它工作正常。
inline fun <T : Any> LazyGridScope.items(
items: LazyPagingItems<T>,
crossinline itemContent: @Composable LazyGridItemScope.(item: T?) -> Unit
) {
items(count = items.itemCount) { index ->
itemContent(items[index])
}
}
但是,我想利用 LazyLazyout
提供的其他参数,例如 key
、span
等,并尝试了以下功能。
inline fun <T : Any> LazyGridScope.items(
items: LazyPagingItems<T>,
noinline key: ((item: T?) -> Any)? = null,
noinline span: (LazyGridItemSpanScope.(item: T?) -> GridItemSpan)? = null,
noinline contentType: (item: T?) -> Any? = { null },
crossinline itemContent: @Composable LazyGridItemScope.(item: T?) -> Unit
) = items(
count = items.itemCount,
key = if (key != null) { index: Int -> key(items[index]) } else null,
span = if (span != null) { { span(items[it]) } } else null,
contentType = { index: Int -> contentType(items[index]) }
) {
itemContent(items[it])
}
当我将该函数与 key
一起使用时,它显示 Type mismatch: inferred type is Long? but Any was expected
.
items(items = products, key = { product -> product?.productId }) {
//Content
}
我猜这是由于 public class LazyPagingItems<T : Any>
的声明。我如何解决它以将所有参数与分页项目一起使用?
对于 product?.productId
,您试图传递一个可选的 Int?
值,而 key
需要一个 non-optional Any
值。
当您将 key = null
传递给计算块时,它会根据索引为每个对象创建一个唯一的键。一个特定的项目键不能是 null
,因为那样会使它等于其他项目键,这是被禁止的。
您只能为非可选项目调用key
,并提供index
作为可选案例的默认值:
inline fun <T : Any> LazyGridScope.items(
// ...
noinline key: ((item: T) -> Any)? = null,
// ...
) = items(
// ...
key = if (key != null) { index: Int -> items[index]?.let(key) ?: index } else null,
// ...
用法:
items(items = products, key = { product -> product.productId }) {