【发布时间】:2022-01-10 22:17:47
【问题描述】:
我有一个带有 Jetpack Compose 的屏幕,其中有一个 TextField 供用户编写文本。
我将通过此文本进行查询以获取数据。我希望在用户完成输入后进行此查询。
有没有办法知道用户是否需要 2 秒而不写(例如)来启动此查询?
【问题讨论】:
标签: android kotlin android-jetpack-compose
我有一个带有 Jetpack Compose 的屏幕,其中有一个 TextField 供用户编写文本。
我将通过此文本进行查询以获取数据。我希望在用户完成输入后进行此查询。
有没有办法知道用户是否需要 2 秒而不写(例如)来启动此查询?
【问题讨论】:
标签: android kotlin android-jetpack-compose
要在用户停止输入 2 秒后查询,我认为您可以使用 debounce 运算符(与此处的答案类似 Jetpack Compose and Room DB: Performance overhead of auto-saving user input?)
这里是处理TextField上的文本更改,然后查询数据库并将结果返回给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
}
}
在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)
}
【讨论】: