> Как реализовать debounce для поиска с корутинами в Kotlin (Kotlin, Android)

Уровень: senior · Роль: mobile · Категория: Технические вопросы

Компании: Wildberries

Стек: Kotlin, Android

> Пример ответа

Для реализации debounce поиска с корутинами в Kotlin (Android) используйте корутину с задержкой и отменой. Вот пример:

class SearchViewModel : ViewModel() {
    private val searchJob = Job()
    private val searchScope = CoroutineScope(Dispatchers.Default + searchJob)

    private val _searchQuery = MutableStateFlow("")
    val searchResults: StateFlow<List<String>> = _searchQuery
        .debounce(300) // задержка 300 мс
        .flatMapLatest { query ->
            flow { emit(searchInRepository(query)) }
        }
        .stateIn(searchScope, SharingStarted.WhileSubscribed(), emptyList())

    fun onSearchQueryChanged(query: String) {
        _searchQuery.value = query
    }

    override fun onCleared() {
        super.onCleared()
        searchJob.cancel()
    }
}

Ключевые моменты:

  • debounce(300) - игнорирует быстрые изменения запроса, ожидая паузы в 300 мс.
  • flatMapLatest - отменяет предыдущий поиск при новом запросе.
  • stateIn - преобразует Flow в StateFlow для UI.
  • Используйте viewModelScope для автоматической отмены при уничтожении ViewModel.

Альтернативный вариант с явной корутиной:

private var searchJob: Job? = null

fun search(query: String) {
    searchJob?.cancel()
    searchJob = viewModelScope.launch {
        delay(300)
        // выполнить поиск
    }
}

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью