LiveData vs StateFlow vs SharedFlow: Android Developer nên chọn gì trong 2026?
"Cả 3 đều là observable data holder. Nhưng dùng sai chỗ sẽ khiến architecture của bạn trở nên khó maintain."
Mở đầu
Nếu bạn làm Android đủ lâu, chắc chắn đã từng gặp câu hỏi:
- Nên dùng
LiveDatahayStateFlow? SharedFlowdùng để làm gì?- Có nên migrate toàn bộ LiveData sang Flow không?
Thoạt nhìn, cả 3 đều giống nhau:
dữ liệu thay đổi → UI update
Nhưng thực tế, mục đích thiết kế hoàn toàn khác nhau.
Bài viết này sẽ giúp bạn hiểu rõ:
- điểm giống
- điểm khác
- use case phù hợp
- recommendation cho Android 2026

1. Tổng quan nhanh
| Tool | Mục đích chính |
|---|---|
| LiveData | UI state truyền thống |
| StateFlow | UI state hiện đại |
| SharedFlow | one-time event |
2. LiveData
LiveData là observable data holder truyền thống trong Android.
Ví dụ:
private val _name = MutableLiveData<String>()
val name: LiveData<String> = _name
Ưu điểm:
✅ lifecycle-aware mặc định
✅ dễ học
✅ tích hợp tốt với XML + MVVM
Nhược điểm:
❌ Android-only
❌ không coroutine-native
❌ yếu về reactive stream
Khi nào nên dùng LiveData?
Phù hợp khi:
- maintain project cũ
- app đang dùng XML
- chưa migrate coroutine
3. StateFlow
Google định nghĩa:
"StateFlow is a state-holder observable flow."
Nguồn:
https://developer.android.com/kotlin/flow/stateflow-and-sharedflow
Ví dụ:
private val _uiState = MutableStateFlow(UiState())
val uiState: StateFlow<UiState> = _uiState
Đặc điểm của StateFlow
- luôn giữ giá trị mới nhất
- bắt buộc có initial value
- hot stream
- coroutine-native
Ví dụ model:
data class UiState(
val loading: Boolean = false,
val users: List<User> = emptyList()
)
Update:
_uiState.value = current.copy(
loading = true
)
Khi nào dùng StateFlow?
Rất phù hợp cho:
- screen state
- form state
- Jetpack Compose
- modern MVVM
4. SharedFlow
Google định nghĩa:
"SharedFlow emits values to multiple consumers."
Nguồn:
https://developer.android.com/kotlin/flow/stateflow-and-sharedflow
Ví dụ:
private val _event = MutableSharedFlow<UiEvent>()
val event = _event.asSharedFlow()
Use case phổ biến
- Navigation
- Toast
- Snackbar
- Dialog trigger
Ví dụ:
sealed class UiEvent {
object NavigateHome : UiEvent()
}
Emit event:
_event.emit(UiEvent.NavigateHome)
Collect ở UI:
lifecycleScope.launch {
viewModel.event.collect {
// navigate
}
}
5. So sánh trực tiếp
| Feature | LiveData | StateFlow | SharedFlow |
|---|---|---|---|
| lifecycle-aware | native | cần repeatOnLifecycle() |
cần repeatOnLifecycle() |
| initial value | không cần | bắt buộc | không cần |
| giữ latest value | có | có | tùy config |
| one-time event | kém | kém | tốt |
| coroutine-native | không | có | có |
| Compose friendly | trung bình | rất tốt | tốt |
6. Sai lầm phổ biến
Sai lầm 1: dùng StateFlow cho Navigation
Sai:
MutableStateFlow<NavEvent?>
Vấn đề:
- rotate màn hình
- event bị emit lại
=> người dùng bị navigate 2 lần.
Giải pháp:
✅ dùng SharedFlow
Sai lầm 2: dùng SharedFlow cho UI State
Sai:
MutableSharedFlow<UiState>()
Vấn đề:
- collector tới muộn sẽ mất state
Giải pháp:
✅ dùng StateFlow
Sai lầm 3: migrate mọi thứ khỏi LiveData
Không cần thiết.
Nếu app cũ đang ổn:
LiveData vẫn hoàn toàn acceptable.
Đừng migrate chỉ vì trend.
7. Recommendation 2026
Rule đơn giản:
UI State -> StateFlow
One-time Event -> SharedFlow
Legacy XML -> LiveData
Đây là guideline được đa số Android team hiện nay áp dụng.
8. Kết luận
Không có tool nào "best".
Chỉ có tool "đúng use case".
Tóm lại:
LiveData→ old but stableStateFlow→ modern defaultSharedFlow→ event specialist
Nếu bắt đầu project mới:
chọn
StateFlow + SharedFlow
Nếu maintain legacy:
giữ
LiveData
Đó là quyết định thực tế nhất.
References
1. Android Developers — StateFlow and SharedFlow
https://developer.android.com/kotlin/flow/stateflow-and-sharedflow
2. Android Developers — LiveData
https://developer.android.com/topic/libraries/architecture/livedata
3. Viblo — LiveData với Coroutines và Flow trong Android
https://viblo.asia/p/livedata-voi-coroutines-va-flow-trong-android-aWj533kQ56m
All rights reserved