Member-only story
Rethinking LiveData in Android Development
2 min readJun 14, 2025
LiveData
used to be the go-to solution for observing data in Android apps. It brought lifecycle-awareness and simplified data binding between ViewModel and UI. However, with the evolution of Kotlin and coroutines, Flow
has emerged as the more powerful and flexible alternative.
1. 🧬 Lifecycle Dependency
LiveData is lifecycle-aware, but this means it’s tightly coupled with Android’s LifecycleOwner
. This limits its use to UI layers only.
// LiveData in ViewModel
val currentEra: LiveData<String> = liveData {
emit(taylorRepository.getCurrentEra()) // "1989", "Reputation", etc.
}
Whereas Flow is lifecycle-agnostic, making it more suitable for clean architecture:
// Flow in ViewModel
val currentEra: Flow<String> = flow {
emit(taylorRepository.getCurrentEra())
}
You can convert Flow
to LiveData
in the UI if needed:
val eraLiveData: LiveData<String> = currentEra.asLiveData()
2. 🔁 Cold vs. Hot Streams
- LiveData is hot: once active, it keeps emitting data.
- Flow is cold: it only runs when collected.
// LiveData: triggers right away
currentEra.observe(viewLifecycleOwner) {
// "Red"…