Ошибка LazyColumn: требуется LazyPagingItems<TypeVariable(T)>, но найден List<T>
я используюPaging 3
библиотека с и я хочу отсортировать список в соответствии с категорией элементов списка покупок. В приведенном ниже кодеLazyColumn
жалуется, что ожидаетLazyPagingItems<TypeVariable(T)>
дляitems
имущество, но найденоList<ShoppingListItem?>
. Как я могу это исправить?
Составной
val lazyListState = rememberLazyListState()
val successItems = allItemsState.allItems?.collectAsLazyPagingItems()
LazyColumn(
state = lazyListState,
modifier = Modifier
.fillMaxWidth(),
contentPadding = PaddingValues(
start = 5.dp,
end = 5.dp,
top = 8.dp,
bottom = 165.dp
),
verticalArrangement = Arrangement.spacedBy(5.dp),
) {
val groupedByCategory = successItems!!.itemSnapshotList.groupBy { it!!.category }
groupedByCategory.forEach { (initial, shoppingListItems) ->
item {
Text(text = initial)
}
items(
items = shoppingListItems, //Throws error at this line
key = { item ->
item.id
}
) { item ->
ShoppingListScreenItem(
item = item,
mainViewModel = shoppingListScreenViewModel,
onNavigateToAddEditItemScreenFromItemStrip = { shoppingListItem ->
onNavigateToAddEditItemScreenFromItemStrip(shoppingListItem)
},
) { isChecked ->
scope.launch {
shoppingListScreenViewModel.changeItemChecked(
item,
isChecked
)
}
}
Divider(color = Color.LightGray, thickness = 1.dp)
}
}
}
Сообщение об ошибке
Type mismatch.
Required:
LazyPagingItems<TypeVariable(T)>
Found:
List<ShoppingListItem?>
4 ответа
The items(LazyPagingItems)
функция была удалена из более новых версий библиотеки, возможно, поэтому вам не удалось найти файл import. Это было сделано для того, чтобы сделать API более гибким и обеспечить поддержку всех типовLazyContainers
.
Согласно примечаниям к выпуску здесь: Paging Compose Version 1.0.0-alpha20, следует использовать следующий подход:
val lazyPagingItems = pager.collectAsLazyPagingItems()
LazyVerticalGrid(columns = GridCells.Fixed(2)) {
// Here we use the standard items API
items(
count = lazyPagingItems.itemCount,
// Here we use the new itemKey extension on LazyPagingItems to
// handle placeholders automatically, ensuring you only need to provide
// keys for real items
key = lazyPagingItems.itemKey { it.uniqueId },
// Similarly, itemContentType lets you set a custom content type for each item
contentType = lazyPagingItems.itemContentType { "contentType" }
) { index ->
// As the standard items call provides only the index, we get the item
// directly from our lazyPagingItems
val item = lazyPagingItems[index]
PagingItem(item = item)
}
}
Соответствующийimport
в этом случае требуется заявление.
ЕслиLazyColumn
используетList<T>
дляitems
DSL, то требуется следующий оператор импорта:
import androidx.compose.foundation.lazy.items
Но, если он используетLazyPagingItems<TypeVariable(T)>
, затем используйте следующий оператор импорта:
import androidx.paging.compose.items
И оба импорта можно использовать одновременно, если, например, вы используете условную логику для загрузки любого из типов коллекций.
Просто как чтоV Mircan
сказали, что удалили. Но вы можете написать свой собственный, например:
import androidx.compose.foundation.lazy.LazyItemScope
import androidx.compose.foundation.lazy.LazyListScope
import androidx.compose.runtime.Composable
import androidx.paging.compose.LazyPagingItems
import androidx.paging.compose.itemContentType
import androidx.paging.compose.itemKey
fun <T: Any> LazyListScope.items(
items: LazyPagingItems<T>,
key: ( (T) -> Any )? = null,
contentType: ( (T) -> Any )? = null,
itemContent: @Composable LazyItemScope.(T) -> Unit
) {
items(
items.itemCount,
key = items.itemKey(key),
contentType = items.itemContentType(contentType)
) loop@ { i ->
val item = items[i] ?: return@loop
itemContent(item)
}
}
Затем вы можете использовать его как другиеitems
. Надеюсь, это поможет.
У меня это работает. Попробуйте это:
Привет, пожалуйста, попробуйте один раз:
listData?.let {
items(it) { item ->
ProductElement(
drawable = R.drawable.picture,
title = item.title,
brand = item.brand,
prize = "${item.price}"
)
}
}