Kotlin Flow yapısı – Flow ve LiveData farkları
İçindekiler
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
- 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.
- 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.
- 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.
- 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:
- 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.
- 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.
- 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.
- 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.