Assurez-vous de mettre à jour votre StateFlow en toute sécurité dans Kotlin !  |  par Patryk Kosieradzki |  juillet 2021
Android

Assurez-vous de mettre à jour votre StateFlow en toute sécurité dans Kotlin !

Le 29 juillet 2021 - 3 minutes de lecture

 

La photo de version 

Bonjour, je viens à vous aujourd’hui avec un conseil rapide sur la façon de mettre à jour votre ÉtatFlow en toute sécurité à Kotlin.

Récemment une nouvelle version de Kotlin Cortinas La bibliothèque a été publiée avec de nouvelles fonctions d’extension pour vous aider avec ÉtatFlow mises à jour. Tout a commencé avec ce problème :

Voyons de quoi il s’agit…

si c’est ta première fois avec ÉtatFlow et vous voulez en savoir plus à son sujet et comment il se rapporte aux autres, comment Flux partagé ou alors données en direct, vous pouvez lire mon article à ce sujet ici :

ÉtatFlow il est principalement utilisé pour gérer les mises à jour d’état et d’état. Peut être utilisé, par exemple, sur Android Voir Modèle d’exposer l’État à leurs opinions.

Regardons un exemple :

Comment récupérer ce statut maintenant sur Fragment par exemple? Toutes les informations peuvent être trouvées dans mon article que j’ai mentionné précédemment 🙂

Eh bien, c’est assez facile puisque nous utilisons une classe de données. Nous pouvons simplement utiliser copie de alors:

_uiState.value = _uiState.value.copy(title = "Something")

Simple, non ? Mais il faut faire attention…

Donc quel est le problème? Bien que le code soit très simple, il y a quelque chose que vous devez savoir : CONCURRENCE.

si le temps entre copie de pleine fonction et le StateFlow’s nouvelle valeur est émise, un autre thread essaie de mettre à jour le ÉtatFlow – en utilisant copie de et mettre à jour l’une des propriétés que le copie de ne change pas – nous pouvons nous retrouver avec des résultats auxquels nous ne nous attendions pas.

Comment résolvons-nous ce problème? Utiliser de bonnes nouveautés de Kotlin Cortinas pour MutableStateFlow.

Je parle de ces trois méthodes :

Ils utilisent tous un paramètre de fonction qui renvoie le nouvel état qui sera émis.

Voyons un instant ce qu’il y a dans la méthode de mise à jour :

public inline fun <T> MutableStateFlow<T>.update(function: (T) -> T) {
while (true) {
val prevValue = value
val nextValue = function(prevValue)
if (compareAndSet(prevValue, nextValue)) {
return
}
}
}

Comme on peut le voir, une fonction est passée en paramètre et est appliquée au courant ÉtatFlowvaleur de. Puis comparer Et Définir La fonction est utilisée pour déterminer si la valeur a changé – par exemple, par un autre thread. si comparer Et Définir renvoie false afin que la boucle while s’exécute jusqu’à ce qu’il soit possible de mettre à jour l’état.

Alors comment utiliser ? Voyons un exemple EN SÉCURITÉ Mettez à jour maintenant:

_uiState.update { it.copy(title = "Something") }

C’est ça! Cela nous assure que l’état peut être changé. Avec la sécurité!

Commentaires

Laisser un commentaire

Votre commentaire sera révisé par les administrateurs si besoin.