0

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 LiveData hay StateFlow?
  • SharedFlow dù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 tùy config
one-time event kém kém tốt
coroutine-native không
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 stable
  • StateFlow → modern default
  • SharedFlow → 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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí