Dans la bibliothèque Android Architecture Components récemment publiée par Google, nous avons deux fonctions statiques dans la classe Transformations
. Bien que la fonction map
soit simple et facilement compréhensible, je trouve difficile de comprendre correctement la fonction switchMap
.
La documentation officielle de switchMap peut être trouvée ici .
Quelqu'un peut-il expliquer comment et où utiliser la fonction switchMap avec un exemple concret?
Dans la fonction map()
LiveData userLiveData = ...;
LiveData userName = Transformations.map(userLiveData, user -> {
return user.firstName + " " + user.lastName; // Returns String
});
chaque fois que la valeur de userLiveData
change, userName
sera également mise à jour. Notez que nous retournons un String
.
Dans la fonction switchMap()
:
MutableLiveData userIdLiveData = ...;
LiveData userLiveData = Transformations.switchMap(userIdLiveData, id ->
repository.getUserById(id)); // Returns LiveData
void setUserId(String userId) {
this.userIdLiveData.setValue(userId);
}
À chaque changement de la valeur de userIdLiveData
, repository.getUserById(id)
sera appelé, tout comme la fonction map. Mais repository.getUserById(id)
renvoie une LiveData
. Ainsi, chaque fois que la valeur de LiveData
renvoyée par repository.getUserById(id)
change, la valeur de userLiveData
change également. Donc, la valeur de userLiveData
dépendra des changements de userIdLiveData
et des changements de la valeur de repository.getUserById(id)
.
Exemple pratique de switchMap()
: imaginez que vous avez un profil d’utilisateur avec un bouton Suivre et un bouton de profil suivant qui définit une autre information de profil. Le bouton de profil suivant appellera setUserId () avec un autre identifiant afin que userLiveData
change et que l'interface utilisateur change. Le bouton Suivre appellera le DAO pour ajouter un suiveur à cet utilisateur. Ainsi, l'utilisateur aura 301 suiveurs au lieu de 300. userLiveData
disposera de cette mise à jour provenant du référentiel, qui provient du DAO.
Ajout de mes 2 cents à la réponse @DamiaFuentes.
MutableLiveData userIdLiveData = ...;
LiveData userLiveData = Transformations.switchMap(userIdLiveData, id ->
repository.getUserById(id)); // Returns LiveData
void setUserId(String userId) {
this.userIdLiveData.setValue(userId);
}
La méthode Transformations.switchMap ne sera appelée que si vous avez au moins un observateur pour userLiveData
Pour ceux qui veulent plus d'explications sur l'exemple de la fonction @DamiaFuentes switchmap () donné ci-dessous:
MutableLiveData userIdLiveData = ...;
LiveData userLiveData = Transformations.switchMap(userIdLiveData, id ->
repository.getUserById(id));
void setUserId(String userId) {
this.userIdLiveData.setValue(userId);
}
Dans un scénario où le référentiel contient User (1, "Jane") et User (2, "John"), lorsque la valeur userIdLiveData est définie sur "1", le switchMap appelle getUser (1), qui renvoie un LiveData. contenant la valeur User (1, "Jane"). Alors maintenant, userLiveData émettra User (1, "Jane"). Lorsque l'utilisateur du référentiel est mis à jour en utilisateur (1, "Sarah"), l'utilisateur LiveData est automatiquement averti et émet un utilisateur (1, "Sarah").
Lorsque la méthode setUserId est appelée avec userId = "2", la valeur de userIdLiveData est modifiée et déclenche automatiquement une demande d'obtention de l'utilisateur avec l'ID "2" à partir du référentiel. Ainsi, la userLiveData émet User (2, "John"). Les données LiveData renvoyées par repository.getUserById (1) sont supprimées en tant que source.
À partir de cet exemple, nous pouvons comprendre que userIdLiveData est le déclencheur et que les LiveData renvoyées par repository.getUserById sont les "sauvegardes" de LiveData.
Pour plus de références, consultez: https://developer.Android.com/reference/Android/Arch/lifecycle/Transformations