Я давно уже перешла с LiveData на Flow. Это действительно хороший и сильный инструмент, но что меня раздражало — нельзя повторно отправить такое же событие. Например, если один раз отправилось true, то повторно true не отправить, а часто это нужно сделать (например, когда пользователь настойчиво тыкает на кнопку и нам нужно показать ему одну и ту же ошибку, которую отдаем через flow). Приходилось городить какие-то костыли и искать обходные пути.
Сегодня наткнулась на статью https://medium.com/@codescape/migrating-from-livedata-to-flow-in-5-steps-c3bf386571d7, которая показывает интересное и элегантное решение. Делюсь :)
Суть в том, что мы создаем изначально Channel, а не MutableStateFlow, но для значение при подписке добавляем метод receiveAsFlow(), который превратит наш канал во flow.
Я набросала быстрый пример: https://github.com/Ladgertha/FlowExample. Одна активити и две кнопки. По клику на любую кнопку мы кладем значение true и в активити хотим поймать его и показать рандомное число. Если мы кликнем на первую кнопку oldFlow, то увидим, что значение поменяется всего один раз, а потом ничего не происходит. А вот если будем кликать на newFlow, то каждый раз число будет меняться и всё корректно работает. Ура! :)
Посмотреть отличия можно внутри MainViewModel: