Mil*_*les 6 android kotlin android-room android-jetpack-compose
我正在使用 Jetpack Compose 编写一个应用程序,允许用户在其中输入文本TextFields并检查一些单选按钮。
然后,该数据被存储在 Room 数据库中。
目前,我在屏幕底部有一个“保存”按钮,上面有一个“离开而不保存?” 弹出窗口。
但是,我想完全摆脱保存按钮并让它在键入时自动保存数据。
键入重复的数据库查询是否会导致任何性能问题?对于此类事情是否有任何既定的最佳实践?
Phi*_*hov 13
通过 kotlin flow,您可以使用debounce,它是专门为此类情况设计的。这样,只要用户输入文本,saveToDatabase就不会被调用,并且当他一段时间没有输入字符时(在我的示例中为一秒)-流将被发出。
此外,在 Compose Navigation 期间,如果屏幕关闭,视图模型可能会被销毁(并且协程将被取消),在这种情况下,我还会将数据保存在其中onCleared以确保没有丢失任何内容。
class ScreenViewModel: ViewModel() {
private val _text = MutableStateFlow("")
val text: StateFlow<String> = _text
init {
viewModelScope.launch {
@OptIn(FlowPreview::class)
_text.debounce(1000)
.collect(::saveToDatabase)
}
}
fun updateText(text: String) {
_text.value = text
}
override fun onCleared() {
super.onCleared()
saveToDatabase(_text.value)
}
private fun saveToDatabase(text: String) {
}
}
@Composable
fun ScreenView(
viewModel: ScreenViewModel = viewModel()
) {
val text by viewModel.text.collectAsState()
TextField(value = text, onValueChange = viewModel::updateText)
}
Run Code Online (Sandbox Code Playgroud)
@OptIn(FlowPreview::class)意味着API将来可能会改变。如果您现在不想使用它,请参阅此处的替代品。
| 归档时间: |
|
| 查看次数: |
1268 次 |
| 最近记录: |