tutorial room livedata jetpack example ejemplo android android-architecture-components android-livedata

room - viewmodel android



¿Cómo y dónde usar Transformations.switchMap? (3)

En la reciente biblioteca de componentes de arquitectura de Android lanzada por Google, tenemos dos funciones estáticas en la clase Transformations . Si bien la función de map es sencilla y fácil de entender, me resulta difícil entender correctamente la función switchMap .

La documentación oficial de switchMap se puede encontrar here .

¿Alguien puede explicar cómo y dónde usar la función switchMap con un ejemplo práctico?


Agregando mis 2 centavos a la respuesta de @DamiaFuentes.

MutableLiveData userIdLiveData = ...; LiveData userLiveData = Transformations.switchMap(userIdLiveData, id -> repository.getUserById(id)); // Returns LiveData void setUserId(String userId) { this.userIdLiveData.setValue(userId); }

El método Transformations.switchMap solo se llamará cuando tengas al menos un observador para userLiveData


En la función map()

LiveData userLiveData = ...; LiveData userName = Transformations.map(userLiveData, user -> { return user.firstName + " " + user.lastName; // Returns String });

userLiveData vez que el valor de userLiveData cambie, userName también se actualizará. Observe que estamos devolviendo un String .

En la función switchMap() :

MutableLiveData userIdLiveData = ...; LiveData userLiveData = Transformations.switchMap(userIdLiveData, id -> repository.getUserById(id)); // Returns LiveData void setUserId(String userId) { this.userIdLiveData.setValue(userId); }

userIdLiveData vez que se userIdLiveData al valor de los cambios de userIdLiveData , se userIdLiveData repository.getUserById(id) , al igual que la función de mapa. Pero repository.getUserById(id) devuelve un LiveData . Así que cada vez que el valor de LiveData devuelto por repository.getUserById(id) cambie, el valor de userLiveData también cambiará. Por lo tanto, el valor de userLiveData dependerá de los cambios de userIdLiveData y los cambios del valor de repository.getUserById(id) .

Ejemplo práctico de switchMap() : imagine que tiene un perfil de usuario con un botón de seguimiento y el siguiente botón de perfil que establece otra información de perfil. El siguiente botón de perfil llamará a setUserId () con otro id, por lo que userLiveData cambiará y la interfaz de usuario cambiará. El botón Seguir llamará al DAO para agregar un seguidor más a ese usuario, de modo que el usuario tendrá 301 seguidores en lugar de 300. userLiveData tendrá esta actualización que proviene del repositorio, que proviene del DAO.


Para aquellos que desean una explicación más detallada de la función @DamiaFuentes switchmap () que se muestra a continuación:

MutableLiveData userIdLiveData = ...; LiveData userLiveData = Transformations.switchMap(userIdLiveData, id -> repository.getUserById(id)); void setUserId(String userId) { this.userIdLiveData.setValue(userId); }

En un escenario donde el repositorio contiene Usuario (1, "Jane") y Usuario (2, "John"), cuando el valor userIdLiveData se establece en "1", el switchMap llamará a getUser (1), que devolverá un LiveData que contiene el valor Usuario (1, "Jane"). Así que ahora, el userLiveData emitirá User (1, "Jane"). Cuando el usuario en el repositorio se actualiza al Usuario (1, "Sarah"), el UserLiveData recibe una notificación automática y emitirá un Usuario (1, "Sarah").

Cuando se llama al método setUserId con userId = "2", el valor de userIdLiveData cambia y activa automáticamente una solicitud para obtener el usuario con el ID "2" del repositorio. Por lo tanto, el userLiveData emite User (2, "John"). El LiveData devuelto por repository.getUserById (1) se elimina como fuente.

De este ejemplo, podemos entender que userIdLiveData es el desencadenante y el LiveData devuelto por repository.getUserById es el LiveData de "respaldo".

Para obtener más información, consulte: https://developer.android.com/reference/android/arch/lifecycle/Transformations