web-dev-qa-db-fra.com

Comment et où utiliser Transformations.switchMap?

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?

23
Ehtesham Hasan

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. 

41
Damia Fuentes

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

6
Prakash

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

1
Sonu Sanjeev