Ich habe einige Fragen zu Kotlin Flow
- Ich kann LiveData von mehreren Fragmenten aus beobachten. Kann ich das mit Flow machen? Wenn ja, wie dann?
- Mit
map
& können wir mehrere LiveData von einer einzigen LiveData habenswitchMap
. Gibt es eine Möglichkeit, mehrere Flows aus einer einzigen Quelle zu erhalten? - Mit
MutableLiveData
Ich kann Daten von überall mithilfe der Variablenreferenz aktualisieren. Gibt es eine Möglichkeit, dasselbe mit Flow zu tun?
Ich habe einen Anwendungsfall wie: Ich werde eine SharedPreferences
Verwendung beobachten , callbackFlow{...}
die mir einen einzigen Quellfluss gibt. Aus diesem Flow möchte ich für jedes Schlüssel-Wert-Paar mehrere Flows erstellen.
Das klingen vielleicht albern. Ich bin neu in der Rx- und Flow-Welt.
Antworten:
Ja. Sie können dies mit
emit
und tuncollect
. Thinkemit
ähnelt Live-DatenpostValue
undcollect
ähneltobserve
. Geben wir ein Beispiel.Repository
ViewModel
Fragment
Flow ist sehr praktisch. Sie können einfach einen Fluss innerhalb des Flusses erstellen. Nehmen wir an, Sie möchten jedem Wettervorhersagedaten ein Gradzeichen hinzufügen.
ViewModel
Sammeln Sie dann die Daten in Fragment wie in Nr. 1. Hier sammelt das Ansichtsmodell Daten aus dem Repository und das Fragment Daten aus dem Ansichtsmodell.
Sie können keinen Wert außerhalb des Flusses ausgeben. Der Codeblock innerhalb des Flusses wird nur ausgeführt, wenn ein Kollektor vorhanden ist. Sie können den Datenfluss jedoch mithilfe der asLiveData-Erweiterung von LiveData in Live-Daten konvertieren.
ViewModel
In Ihrem Fall können Sie dies tun
Bearbeiten
Vielen Dank an @mark für seinen Kommentar. Das Erstellen eines neuen Flusses im Ansichtsmodell für die
getWeatherForecast
Funktion ist eigentlich nicht erforderlich. Es könnte umgeschrieben werden alsquelle
val sharedPref = getSharedPref()
und Sie können sammeln an mehreren Stellen verwendensharedPref.collect {}
. Das einzige, was ist, weil sammeln ist suspendieren, müssen Sie es vom Coroutine-Block aufrufen. Und gerne helfen np :)Flow.asLiveData()
In den neuenandroidx.lifecycle
ktx-Paketen gibt es eine neue Erweiterungsfunktion . Weitere Informationen finden Sie in meinem Artikel: https://www.netguru.com/codestories/android-coroutines-%EF%B8%8Fin-2020quelle
In einer dreistufigen Architektur: Datendomänenpräsentation sollte Flow in der Datenschicht (Datenbanken, Netzwerk, Cache ...) stattfinden. Anschließend können Sie Flow, wie Samuel Urbanowicz erwähnt hat, LiveData zuordnen.
Im Allgemeinen ist Flow fast das, was Observable (oder Flowable) für RxJava ist. Verwechseln Sie es nicht mit LiveData.
mehr hier: https://medium.com/@elizarov/cold-flows-hot-channels-d74769805f9
quelle