19.08.2025

19.08.2025

Android

Android

5 min

5 min

Flow vs StateFlow vs SharedFlow: Memahami Perbedaan dan Kegunaannya

Flow vs StateFlow vs SharedFlow: Memahami Perbedaan dan Kegunaannya

Dalam pengembangan aplikasi Android modern, pengelolaan data asynchronous dan aliran data yang terus berubah adalah hal yang sangat penting. Kotlin menghadirkan solusi elegan melalui Coroutines Flow, serta turunannya StateFlow dan SharedFlow, yang kini banyak digunakan menggantikan LiveData atau bahkan RxJava.

Artikel ini akan membahas:

  1. Apa itu Flow, StateFlow, dan SharedFlow

  2. Perbedaan dan kapan digunakan

  3. Contoh implementasi sederhana di Android

1. Flow: Stream Data Asynchronous

Flow adalah API Kotlin Coroutines yang memungkinkan kita mengalirkan (emit) banyak data secara asynchronous dari waktu ke waktu.

Contoh Flow sederhana:

fun angkaFlow(): Flow<Int> = flow {
    for (i in 1..5) {
        delay(500)
        emit(i)
    }
}

Menggunakan di Activity/Fragment:

lifecycleScope.launch {
    angkaFlow().collect { value ->
        Log.d("Flow", "Angka: $value")
    }
}

👉 Kapan pakai Flow?

  • Saat ingin mengamati data yang terus berubah (stream) dari Room, API call berulang, sensor, dsb.

2. StateFlow: State yang Selalu Update

StateFlow adalah turunan Flow yang selalu menyimpan nilai terbaru (current state).
Konsepnya mirip dengan LiveData, tapi berbasis Coroutines.

Contoh StateFlow di ViewModel:

class CounterViewModel : ViewModel() {
    private val _counter = MutableStateFlow(0)
    val counter: StateFlow<Int> get() = _counter

    fun increment() {
        _counter.value += 1
    }
}

Collect di Activity:

lifecycleScope.launch {
    viewModel.counter.collect { value ->
        Log.d("StateFlow", "Counter: $value")
    }
}

👉 Kapan pakai StateFlow?

  • Saat ingin menyimpan state UI yang selalu ada nilai terakhir (contoh: jumlah item keranjang, status login, dsb).

3. SharedFlow: Event Broadcast

SharedFlow berbeda dengan StateFlow karena tidak menyimpan state terakhir, melainkan mengirim event ke banyak subscriber sekaligus.
Mirip dengan PublishSubject di RxJava.

Contoh SharedFlow di ViewModel:

class EventViewModel : ViewModel() {
    private val _events = MutableSharedFlow<String>()
    val events: SharedFlow<String> get() = _events

    fun sendEvent(message: String) {
        viewModelScope.launch {
            _events.emit(message)
        }
    }
}

Collect di Activity/Fragment:

lifecycleScope.launch {
    viewModel.events.collect { event ->
        Log.d("SharedFlow", "Event diterima: $event")
    }
}

👉 Kapan pakai SharedFlow?

  • Untuk event sekali jalan, misalnya navigasi, snackbar, toast, atau notifikasi.

Flow vs StateFlow vs SharedFlow

Fitur

Flow

StateFlow

SharedFlow

Aliran data

✅ Stream

✅ Stream

✅ Stream

Menyimpan nilai terakhir

✅ (selalu ada)

Lifecycle aware

❌ (butuh scope)

❌ (butuh scope)

❌ (butuh scope)

Multi-subscriber

❌ (cold)

Cocok untuk

Data berkelanjutan

State UI

Event satu kali

Kesimpulan

  • Flow → cocok untuk data berkelanjutan (database, API streaming).

  • StateFlow → cocok untuk state UI (menyimpan nilai terbaru).

  • SharedFlow → cocok untuk event (navigasi, snackbar, toast).

Dengan memahami perbedaan ini, kamu bisa memilih stream API yang tepat untuk kebutuhan aplikasi Android-mu.

Create a free website with Framer, the website builder loved by startups, designers and agencies.