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é!
Feu gratuit introduit de nouveaux personnages avec une compétence distincte après chaque mise à jour…
Dans une étrange tournure des événements qui semblerait insensée à quiconque vivait il y a…
Google déploie aujourd'hui la mise à jour très attendue qui permettra aux utilisateurs de…
Pour célébrer le lancement de Gran Turismo 7, nous nous sommes associés à des…
Une vue de la Space Needle depuis l'immeuble de bureaux d'Apple à Seattle au…
Tundra Tracker, une rondelle de suivi SteamVR née d'un Kickstarter réussi l'année dernière, a…