4

I have a screen with Jetpack Compose in which I have a TextField for the user to write a text.

With this text I will make a query to obtain data. I want this query to be made when the user finishes typing.

Is there a way to know if the user takes 2 seconds without writing (for example) to launch this query?

Paul9999
  • 311
  • 3
  • 13
  • Does [this](https://stackoverflow.com/questions/70632237/avoid-edittext-textwatcher-firing-events-on-every-character-change/70633680#70633680) help? – Tyler V Jan 09 '22 at 23:03
  • 2
    Does this answer your question? [Jetpack Compose and Room DB: Performance overhead of auto-saving user input?](https://stackoverflow.com/questions/69689839/jetpack-compose-and-room-db-performance-overhead-of-auto-saving-user-input) – Pylyp Dukhov Jan 10 '22 at 05:32

1 Answers1

3

To query after 2 seconds after user stop typing, I think you can use debounce operator (similar idea to the answer here Jetpack Compose and Room DB: Performance overhead of auto-saving user input?)

Here is an example to handle text change on TextField, then query to database and return the result to dbText

class VM : ViewModel() {
    val text = MutableStateFlow("")
    val dbText = text.debounce(2000)
        .distinctUntilChanged()
        .flatMapLatest {
            queryFromDb(it)
        }

    private fun queryFromDb(query: String): Flow<String> {
        Log.i("TAG", "query from db: " + query)
        if (query.isEmpty()) {
            return flowOf("Empty Result")
        }
        // TODO, do query from DB and return result
    }
}

In Composable

Column {
    val text by viewModel.text.collectAsState()
    val dbText by viewModel.dbText.collectAsState("Empty Result")

    TextField(value = text, onValueChange = { viewModel.text.value = it })
    Text(text = dbText)
}
Linh
  • 51,033
  • 19
  • 228
  • 256