Publicado en Android

Cómo crear una clase Singleton en Kotlin para Android


Patrón de diseño Singleton, crear una instancia única. Este patrón de diseño sirve para crear una sola instancia de una clase, es decir que al tener un objeto creado se obtiene su instancia para su uso único y exclusivo, normalmente sirve para la carga de base de datos, repositorios etc…

Sigue leyendo “Cómo crear una clase Singleton en Kotlin para Android”
Publicado en Android

Patrón SingleLiveEvent para ViewModel en Kotlin y AndroidX


Cuando usamos programación reactiva/ funcional y usamos los observadores de datos, pueda que necesitamos que el observador al recibir los datos no vuelva a recibirlos si se rota el dispositivo, se puede usar para informar el usuario de algo, para obtener ese resultado debemos implementar el patrón SingleLiveEvent

open class SingleLiveEvent<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
}

Con ese patrón puede existir varios observadores al mismo tiempo, en cambio si solo queremos que persista un solo observador de los eventos usar la solución original de Google SingleLiveEvent

Declaración en ViewModel

Dentro del viewmodel debemos implementar el SingleLiveEvent

//Notify Single SingleLiveEvent
private val _notifyEvent = MutableLiveData<SingleLiveEvent<String>>()
val notifyEvent: LiveData<SingleLiveEvent<String>>
   get() = _notifyEvent

Observador del SingleLiveEvent

mViewModel.notifyEvent.observe(this, Observer { it ->
    it.getContentIfNotHandled()?.let {
        Toast.makeText(this, it, Toast.LENGTH_SHORT).show()
    }
})

Notificar un Evento

Para notificar un evento solo es necesario cambiar el valor de la variable que hemos declarado con SingleLiveEvent en este caso _notifyEvent

_notifyEvent.value = SingleLiveEvent("tarea finalizada")

_notifyEvent.postValue(SingleLiveEvent("procesando datos"))

Más información al articulo original LiveData with SnackBar, Navigation and other events (the SingleLiveEvent case)