Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

240
Vistas
¿Por qué es necesario un contenedor para un valor LiveData?

Estaba mirando el proyecto JetSurvey (proyecto de muestra de Android Jetpack Compose) y noté que crearon una clase para envolver el valor LiveData en su clase ViewModel. Aquí está la clase de la que estoy hablando:

 /** * Used as a wrapper for data that is exposed via a LiveData that represents an event. */ data class Event<out T>(private val content: T) { var hasBeenHandled = false private set // Allow external read but not write /** * Returns the content and prevents its use again. */ fun getContentIfNotHandled(): T? { return if (hasBeenHandled) { null } else { hasBeenHandled = true content } } /** * Returns the content, even if it's already been handled. */ fun peekContent(): T = content }

En ViewModel, esto se usa así:

 private val _navigateTo = MutableLiveData<Event<Screen>>() val navigateTo: LiveData<Event<Screen>> = _navigateTo fun signInAsGuest() { _navigateTo.value = Event(Survey) }

Parece que el objetivo de la clase Event es evitar que la navegación ocurra varias veces. Sin embargo, no entiendo cómo sucedería eso en primer lugar, porque la navegación solo se activaría una vez que se actualice el valor de LiveData. Y cada vez que se actualiza el valor, se crea un nuevo objeto Evento, por lo que se ejecutaría nuevamente.

Entonces, en el Fragmento, ¿existe la posibilidad de que el código dentro viewModel.navigateTo.observe(viewLifecycleOwner) pueda ejecutarse varias veces sin que se haya actualizado el valor? Si es así, ¿en qué casos sucedería eso?

Si mi comprensión de la función del contenedor de eventos es incorrecta, ¿con qué propósito se implementa? ¿Es necesario en absoluto?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Suponga que su observador LiveData en un Fragmento navega a un segundo Fragmento. El usuario gira la pantalla para que se destruya la primera instancia de Fragmento. Cuando retroceden del segundo Fragmento, se recrea una nueva instancia del primer Fragmento, por lo que su observador se activa nuevamente. Sin el envoltorio del evento, repentina y sorprendentemente navegaría de regreso al segundo Fragmento de inmediato.

Además, un LiveData puede tener múltiples observadores. Tal vez dos fragmentos diferentes estén observando los mismos eventos LiveData, pero no quiere arriesgarse a mostrarle al usuario un mensaje dos veces para el mismo evento. Por ejemplo, podrían navegar a un segundo Fragmento que esté observando los mismos eventos LiveData que el primer Fragmento. Se dispara un evento y el segundo observador de fragmentos muestra al usuario un cuadro de diálogo o algo así. Luego, el usuario retrocede hasta el primer Fragmento y ese mismo evento activará el observador del primer Fragmento para que el evento se maneje dos veces.

Si su proyecto usa corrutinas, una solución más limpia para este problema de observación de eventos es usar SharedFlow con replay de 0 en lugar de usar LiveData con una clase contenedora de eventos. Sospecho que la razón por la que no usaron SharedFlow en el proyecto JetSurvey es que no quieren asumir que ya estás familiarizado con Flows cuando el ejemplo no trata de eso.

Una solución alternativa llamada SingleLiveEvent apareció una vez en un ejemplo oficial de Android, pero se consideró demasiado pirateada para agregarla a las bibliotecas de Jetpack .

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda