es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Observa el flujo como estado de cadena compuesta.

Tengo un objeto Composable y un viewmodel (VM) para él. La VM obtiene algunos datos de un flujo en Kotlin que me gustaría exponer como un ‘State’.

Normalmente la VM expondría un estado así:

var title by mutableStateOf("")
private set

Y lo podría usar en el Composable así:

Text(text = viewModel.title)

Pero ya que los datos vienen de un flujo, tengo que exponerlos así:

@Composable
fun title() = flowOf("TITULO").collectAsState(initial = "")

Y tengo que usarlo en el Composable así:

Text(text = viewModel.title().value)

Intento minimizar el código no deseado, así que el ‘.value’ es un poco molesto para mí. ¿Existe alguna manera de recoger el flujo como ‘state’, pero aún exponerlo como ‘viewModel.title’ o ‘viewModel.title()’ y obtener realmente el ‘String’ y no el objeto de estado?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, puedes usar una sentencia remember dentro de tu composable para recordar el valor de estado del flujo colectado. Luego, puedes simplemente exponer una propiedad regular en tu viewmodel que devuelve este valor de estado recordado.

    Aquí hay un ejemplo:

    @Composable
    fun title(viewModel: MyViewModel) {
        val titleState by remember { viewModel.title().collectAsState(initial = "") }
        viewModel.title = titleState
    }
    
    class MyViewModel : ViewModel() {
        var title: String by mutableStateOf("")
            internal set
    
        fun title() = flowOf("TÍTULO")
    }
    

    En este ejemplo, el método title() sigue devolviendo un flujo que emite la cadena de título. Luego usamos collectAsState() para recopilar este flujo como un valor de estado y lo recordamos dentro del composable usando remember. Finalmente, establecemos la propiedad title de nuestro viewmodel en el valor de estado recordado.

    Ahora, podemos simplemente llamar a viewModel.title en nuestro composable para recuperar el valor de cadena real, sin tener que usar .value.

Comments are closed.