У меня есть несколько вопросов о Kotlin Flow
- Я могу наблюдать LiveData из нескольких фрагментов. Могу ли я сделать это с Flow? Если да, то как?
- Мы можем иметь несколько LiveData из одной LiveData, используя
map
&switchMap
. Есть ли способ иметь несколько потоков из одного источника потока? - Используя
MutableLiveData
я могу обновить данные из любой точки мира, используя ссылку на переменную. Есть ли способ сделать то же самое с Flow?
У меня есть такой пример использования: я буду наблюдать за SharedPreferences
использованием, callbackFlow{...}
которое даст мне единственный источник потока. Из этого потока я хочу создать несколько потоков для каждой пары ключ-значение.
Это может звучать глупо. Я новичок в мире Rx и Flow.
Ответы:
Да. Вы можете сделать это с
emit
иcollect
. Мыслиemit
похожи на живые данныеpostValue
иcollect
похожи наobserve
. Давайте приведем пример.вместилище
ViewModel
Фрагмент
Поток очень удобен. Вы можете просто создать поток внутри потока. Допустим, вы хотите добавить знак градуса к каждому из данных прогноза погоды.
ViewModel
Затем соберите данные во фрагменте так же, как # 1. Здесь происходит то, что модель представления собирает данные из хранилища, а фрагмент собирает данные из модели представления.
Вы не можете излучать значение вне потока. Блок кода внутри потока выполняется только при наличии какого-либо коллектора. Но вы можете преобразовать поток в живые данные, используя расширение asLiveData из LiveData.
ViewModel
В вашем случае вы можете сделать это
редактировать
Спасибо @mark за его комментарий. Создание нового потока в модели представления для
getWeatherForecast
функции фактически не требуется . Это может быть переписано какисточник
val sharedPref = getSharedPref()
и вы можете использовать собирать в нескольких местахsharedPref.collect {}
. Единственное, потому что сбор приостановлен, вам нужно вызвать его из блока сопрограмм. И рад помочь нп :)Есть новая
Flow.asLiveData()
функция расширения в новомandroidx.lifecycle
пакетах ktx . Вы можете узнать больше в моей статье: https://www.netguru.com/codestories/android-coroutines-%EF%B8%8Fin-2020источник
В трехуровневой архитектуре: представление предметной области, поток должен происходить на уровне данных (базы данных, сеть, кэш-память ...) и затем как отметил Сэмюэль Урбанович, вы можете сопоставить поток с LiveData.
В общем, Flow - это почти то, что Observable (или Flowable) для RxJava. Не путайте это с LiveData.
больше здесь: https://medium.com/@elizarov/cold-flows-hot-channels-d74769805f9
источник