kotlin flow vs live data
13 Ekim 2023

Kotlin Flow yapısı – Flow ve LiveData farkları

ile umut

Nedir, ne değildir?

Kotlin’in Flow yapısı işlem akışını modellemek için etkili bir araçtır. Reaktif programlama çerçevesini uygular ve verileri akış halinde yayar. RxJava, RxKotlin, LiveData yapılarını duymuş olabilirsiniz. Flow ile LiveData’daki çoğu şey yapılabildiği için depracate olduğunu düşünebiliriz. Flow Kotlin programlama dilinin en güncel reaktif yapısıdır. Bir Flow, üretilen veri dizisini temsil eder. Veri üreticisi tarafından alıcıya gönderilen akıştaki veriler duyarlı bir şekilde alınır.

Örnek kullanımlar

fun userListFlow() = flow {   
   emit(getCachedUsers())   
   val newUsers = fetchFreshUsers()   
   emit(newUsers)
}

Flow’nun içindeki emit() metodu akışa veri ekler. Yanıt olarak Flow alıcısı bu verileri alır. Bir Flow tanımlandığında derhal çalışmaz, sadece bir talep geldiğinde tetiklenir. Alıcı .collect() metoduyla akışı başlatır:

userListFlow().collect { users ->  
   // users listesi ile çalış 
}

Kotlin’deki Flow gibi akış tanımlarının kolay programlama ve reaktif stil sunması, bir projede büyük veri setlerini ve işlemleri yönetebilmek için güçlü bir araçtır.

Kotlin Flow ve LiveData arasındaki başlıca farklar

  1. Kotlin Flow’ları bir veri akışı sağlar ve veriler kanalla aktarılır. LiveData ise sadece bir canlı veri deposudur, verileri kanalla aktarmaz. Flow’lar verilerin aktarıldığı bir kanal görevi görürken, LiveData verilerin sadece saklandığı bir yerdir.
  2. Flow’lar koşut olarak çalışabilir, yani birden fazla suspend işlev paralel çalışabilir. LiveData ise tek threadlidir, yalnızca UI thread’inde çalışır.
  3. Flow’lar veri akışını kontrol etme imkanı sağlar, yani verilerin ne zaman akışa eklendiğine karar verebiliriz. LiveData ise pasif bir veri deposudur, verilerin ne zaman ekleneceğine biz karar veremeyiz.
  4. Flow koleksiyonları, kanalları ve suspending işlevleri destekler. LiveData için böyle özellikler yoktur, tek yapabildiği gözlemlenebilir veri saklamaktır.

Sonuç

Flow’lar akışkan veri işleme, kanallar ve kontrol edilebilir veri aktarımı için daha elverişlidir. LiveData ise sadece UI güncellemesi için kullanılır ve veriler pasif olarak saklanır.

LiveData ve Flow’un kullanım farklarını örneklenmesi

LiveData Örneği

Kullanıcı listesini görüntülemek için LiveData:

class UserRepository {
  val users = MutableLiveData<List<User>>()

  fun getUsers() = users 
}

// ViewModel
fun loadUsers() {
  users.value = repository.getCachedUsers()
}

Flow Örneği

Aynı işlemi Flow ile yapmak:

class UserRepository {
  fun getUsers() = flow {
    emit(getCachedUsers()) 
    emit(fetchUsersFromNetwork())
  }
}

// ViewModel
fun loadUsers() = usersFlow.collect{
  // verilerle çalış
} 

Kullanım alanları

Flow genellikle verilerin akışını yönetmek için kullanılırken, bazı durumlarda kullanılmaması daha uygun olabilir. İşte Flow kullanmaktan kaçınılması gereken bazı durumlar:

  1. Küçük ve basit veriler: Eğer veri küçük ve basit bir değer ise, Flow kullanmanın gereksiz olabileceğini düşünebilirsiniz. Bu durumda, basit bir değişken veya LiveData kullanmak daha uygun olabilir.
  2. Verinin hızla güncellenmesi gerekmeyen durumlar: Eğer veri hızla güncellenmesi gerekmeyen bir durumu temsil ediyorsa, Flow kullanmak gereksiz olabilir. Örneğin, tarih veya saat gibi verilerin sık sık güncellenmesi gerekmeyebilir ve bu durumda daha basit bir çözüm kullanmak daha mantıklı olabilir.
  3. Sadece bir değeri izlemek için: Eğer sadece bir değeri izlemeniz gerekiyorsa ve veri akışının yönetilmesine ihtiyaç yoksa, Flow kullanmanız gerekmeyebilir. Bu durumda, basit bir değişken kullanmak daha uygun olabilir.
  4. Tek yönlü veri akışı: Eğer verinin yalnızca bir yönde akmasını sağlamanız gerekiyorsa ve geriye dönük izleme veya veri değişiklikleriyle ilgili işlemler yapmanıza gerek yoksa, Flow kullanmanız gerekmeyebilir. Bu durumda, LiveData veya basit bir değişken kullanmak daha uygun olabilir.

Bu durumların dışında, genel olarak Flow verilerin akışını yönetmek için kullanılan güçlü bir araçtır. Ancak her zaman doğru senaryoda kullanılması önemlidir.

Flow tercih edilmelidir:

  • Veriler birden fazla kaynaktan alınıyorsa
  • Veri aktarımı sürekli bir akış olarak düşünülüyorsa
  • Verileri paralel işlemek gerekiyorsa
  • Veri türü basit değil, koleksiyonları destekleniyorsa

LiveData ise:

  • Sadece UI güncellemesi için kullanılıyorsa
  • Veriler tek kaynaktan alınıyorsa
  • Paralel işleme gerek yoksa tercih edilmelidir.