Estoy escribiendo una aplicación con Jetpack Compose que le permite al usuario ingresar texto en algunos TextFields y marcar algunos botones de opción.
Estos datos luego se almacenan en una base de datos de habitaciones.
Actualmente, tengo un botón "guardar" en la parte inferior de la pantalla, con un "¿Salir sin guardar?" surgir.
Sin embargo, me gustaría deshacerme del botón Guardar por completo y hacer que guarde automáticamente los datos a medida que se escriben.
¿Las consultas repetidas de la base de datos al escribir causarían algún problema de rendimiento? ¿Y existen mejores prácticas establecidas para este tipo de cosas?
Con kotlin flow puedes usar debounce , que está diseñado específicamente para estos casos. De esa manera, siempre que el usuario ingrese texto, no se llamará a saveToDatabase , y cuando no ingrese un carácter durante algún tiempo (en mi ejemplo es un segundo), se emitirá el flujo.
Además, durante Compose Navigation, el modelo de vista puede destruirse (y la corrutina se cancelará) si la pantalla está cerrada, en ese caso también guardo los datos dentro de onCleared para asegurarme de que no falte nada.
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) } @OptIn(FlowPreview::class) significa que la API puede cambiarse en el futuro. Si no desea utilizarlo ahora, consulte el reemplazo aquí .