Mam pytania dotyczące Kotlin Flow
- Mogę obserwować LiveData z wielu fragmentów. Czy mogę to zrobić za pomocą Flow? Jeśli tak to jak?
- Możemy mieć wiele LiveData z jednego LiveData za pomocą
map
&switchMap
. Czy jest jakiś sposób na posiadanie wielu Flowów z jednego źródła Flow? - Za pomocą
MutableLiveData
mogę aktualizować dane z dowolnego miejsca za pomocą odwołania do zmiennej. Czy jest jakiś sposób, aby zrobić to samo z Flow?
Mam przypadek użycia: obserwuję SharedPreferences
użycie, callbackFlow{...}
które da mi przepływ z jednego źródła. Na podstawie tego przepływu chcę utworzyć wiele przepływów dla każdej pary klucz-wartość.
Mogą to zabrzmieć głupie pytania. Jestem nowy w świecie Rx i Flow.
Odpowiedzi:
Tak. Możesz to zrobić za pomocą
emit
icollect
. Myślemit
jest podobna do danych na żywopostValue
icollect
jest podobna doobserve
. Podajmy przykład.Magazyn
ViewModel
Fragment
Przepływ jest bardzo przydatny. Możesz po prostu stworzyć przepływ wewnątrz przepływu. Powiedzmy, że chcesz dołączyć znak stopnia do każdego z danych prognozy pogody.
ViewModel
Następnie zbierz dane w Fragmentie takim samym jak nr 1. Oto, co się dzieje, gdy model widoku zbiera dane z repozytorium, a fragment zbiera dane z modelu widoku.
Nie możesz emitować wartości poza przepływem. Blok kodu wewnątrz przepływu jest wykonywany tylko wtedy, gdy istnieje kolektor. Ale możesz przekonwertować przepływ na dane na żywo za pomocą rozszerzenia asLiveData z LiveData.
ViewModel
W twoim przypadku możesz to zrobić
Edytować
Dzięki @mark za komentarz. Utworzenie nowego przepływu w modelu widoku dla
getWeatherForecast
funkcji jest w rzeczywistości niepotrzebne. Można go ponownie zapisać jakoźródło
val sharedPref = getSharedPref()
i możesz używać zbierania w wielu miejscachsharedPref.collect {}
. Jedyną rzeczą jest to, że kolekcjonowanie jest zawieszone, musisz wywołać go z bloku coroutine. I chętnie pomożemy np :)W
Flow.asLiveData()
nowychandroidx.lifecycle
pakietach ktx dostępna jest nowa funkcja rozszerzenia . Możesz dowiedzieć się więcej w moim artykule: https://www.netguru.com/codestories/android-coroutines-%EF%B8%8Fin-2020źródło
W architekturze trójwarstwowej: prezentacja w domenie danych Flow powinien odbywać się w warstwie danych (bazy danych, sieć, pamięć podręczna ...), a następnie, jak wspomniał Samuel Urbanowicz , można zmapować Flow na LiveData.
Ogólnie rzecz biorąc, Flow jest prawie tym, co Obserable (lub Flowble) jest dla RxJava. Nie myl tego z LiveData.
więcej tutaj: https://medium.com/@elizarov/cold-flows-hot-channels-d74769805f9
źródło