#livedata #flow #jetpack
LiveData — классный инструмент, который позволяет получать данные не думая о жизненном цикле компонента. Он удобен, но есть недостатки:🔹разработчики используют его повсюду, в том числе и в репозиториях, где его главная функциональность не нужна. Кроме того, репозиторий должен знать о минимальном количестве компонентов Android, а в лучшем случае вообще не знать;
🔹есть методы
setValue() и postValue(), которые используются в зависимости от потока. И вам постоянно нужно помнить об этой разнице, когда вы делаете их вызов. В случае вызова setValue() не из UI-потока, вы получить Exception, а использование postValue() по всех случаях грозит проблемами. Отлично рассказали о разнице между этими методами тут.🔹дополнительная зависимость в приложении. Меньшая из проблем, однако это лишняя библиотека, которую вам нужно затянуть в приложение.
🔹нет поддержки KMM.
Классной альтернативой является использование
StateFlow. Он потокобезопасный, поддерживает KMM и не требует добавления новых зависимостей в проект.Я уже начал мигрировать свой текущий проект на
StateFlow и отмечу пару недостатков:🔸нет привязки к жизненному циклу по умолчанию. Необходимо использовать методы типа
lifecycleScope.launchWhenResumed() для обеспечания привязки.🔸важно указывать значение при инициализации в отличии от
LiveData. Решение для меня: если такого значения нет — указать null, а при подписке сделать фильтрацию на «не null». Просто один лишний оператор filterNotNull().В остальном — шикарное решение, которое работает из коробки. Детальный гад по миграции и особенностям можно найти тут.
А вы уже переехали на Flow? Есть ли какие-то недостатки?