J'ai des questions sur Kotlin Flow
- Je peux observer LiveData à partir de plusieurs fragments. Puis-je le faire avec Flow? Si oui, alors comment?
- Nous pouvons avoir plusieurs LiveData à partir d'un seul LiveData en utilisant
map
&switchMap
. Existe-t-il un moyen d'avoir plusieurs flux à partir d'un seul flux source? - En utilisant
MutableLiveData
Je peux mettre à jour les données de n'importe où en utilisant la référence de variable. Existe-t-il un moyen de faire de même avec Flow?
J'ai un cas d'utilisation comme: j'observerai une SharedPreferences
utilisation callbackFlow{...}
qui me donnera un flux source unique. À partir de ce flux, je souhaite créer plusieurs flux pour chaque paire clé-valeur.
Ces questions peuvent sembler stupides. Je suis nouveau dans le monde Rx et Flow.
Réponses:
Oui. Vous pouvez le faire avec
emit
etcollect
. Thinkemit
est similaire aux données en directpostValue
etcollect
est similaire àobserve
. Donnons un exemple.Dépôt
ViewModel
Fragment
Le flux est très pratique. Vous pouvez simplement créer un flux à l'intérieur du flux. Supposons que vous souhaitiez ajouter un signe de degré à chacune des données de prévisions météorologiques.
ViewModel
Ensuite, collectez les données dans le fragment identique à # 1. Ici, ce qui se passe, c'est que le modèle de vue collecte les données du référentiel et que le fragment collecte les données du modèle de vue.
Vous ne pouvez pas émettre de valeur en dehors du flux. Le bloc de code à l'intérieur du flux n'est exécuté que lorsqu'il existe un collecteur. Mais vous pouvez convertir le flux en données en direct en utilisant l'extension asLiveData de LiveData.
ViewModel
Dans votre cas, vous pouvez le faire
Éditer
Merci à @mark pour son commentaire. La création d'un nouveau flux dans le modèle de vue pour la
getWeatherForecast
fonction n'est en fait pas nécessaire. Il pourrait être réécrit commela source
val sharedPref = getSharedPref()
et vous pouvez utiliser la collecte à plusieurs endroitssharedPref.collect {}
. La seule chose est que la collecte est suspendue, vous devez l'appeler à partir du bloc coroutine. Et heureux d'aider np :)Il y a une nouvelle
Flow.asLiveData()
fonction d'extension dans les nouveauxandroidx.lifecycle
packages ktx. Vous pouvez en savoir plus dans mon article: https://www.netguru.com/codestories/android-coroutines-%EF%B8%8Fin-2020la source
Dans une architecture à 3 niveaux: présentation du domaine des données, Flow devrait avoir lieu dans la couche de données (bases de données, réseau, cache ...) puis, comme Samuel Urbanowicz l'a mentionné, vous pouvez mapper Flow sur LiveData.
En général, Flow est presque ce que l'Observable (ou Flowable) est pour RxJava. Ne le confondez pas avec LiveData.
plus ici: https://medium.com/@elizarov/cold-flows-hot-channels-d74769805f9
la source