Jetpack Compose 和 Room DB:自动保存用户输入的性能开销?

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将来可能会改变。如果您现在不想使用它,请参阅此处的替代品。