Как предотвратить вспыхивание обновления в Paging в Android JetPack Compose?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как предотвратить вспыхивание обновления в Paging в Android JetPack Compose?

Сообщение Anonymous »

У меня есть экран Compose для страницы результатов поиска. Я хочу показать индикатор загрузки при выполнении поиска, но при последующих поисках я хочу сохранить старые результаты поиска под индикатором загрузки. Вроде как работает React undiferredValue. Поиск быстрый, но не сразу, поэтому я вижу мерцание между результатами поиска и индикатором загрузки. Вот упрощенный пример: < /p>

Код: Выделить всё

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»