Код: Выделить всё
class MainViewModel : ViewModel() {
private val query = MutableStateFlow("")
@OptIn(ExperimentalCoroutinesApi::class)
val searchResultPagingData = query.filter { it.isNotEmpty() }.flatMapLatest { query ->
Pager(PagingConfig(10)) {
SearchPagingSource(query)
}.flow
}.cachedIn(viewModelScope)
fun search(query: String) {
this.query.value = query
}
}
@OptIn(FlowPreview::class)
@Composable
fun MainScreen(modifier: Modifier = Modifier, viewModel: MainViewModel = viewModel()) {
val query = rememberTextFieldState()
val searchResultItems = viewModel.searchResultPagingData.collectAsLazyPagingItems()
LaunchedEffect(Unit) {
snapshotFlow { query.text.toString() }.debounce(150.milliseconds).distinctUntilChanged()
.collectLatest {
viewModel.search(it)
}
}
Column(modifier = modifier) {
OutlinedTextField(state = query)
if (query.text.isNotEmpty()) {
when (searchResultItems.loadState.refresh) {
is LoadState.Loading -> {
Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
CircularProgressIndicator(modifier = Modifier.size(96.dp))
}
}
is LoadState.Error -> Text("Error")
is LoadState.NotLoading -> {
if (searchResultItems.itemCount > 0) {
LazyColumn {
items(
searchResultItems.itemCount,
searchResultItems.itemKey(Model::id),
) { index ->
val searchResult = searchResultItems[index]!!
ListItem(headlineContent = { Text(searchResult.name) })
HorizontalDivider()
}
}
} else {
Text("No results")
}
}
}
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... ck-compose