Kotlin LiveData Kullanımı
Bu yazımda Android Architecture Components’in bir parçası olan LiveData’dan bahsedeceğim. Android Architecture Components hakkında bilginiz yoksa linke tıklayarak inceleyebilirsiniz.
LiveData Nedir?
LiveData, bir verideki değişiklikleri izlememezi sağlayan Observable veri tutucudur. LiveData, lifecycle aware’dir. Yani Activity, Fragment ya da Servis gibi bileşenlerin yaşam döngülerine karşılık hareket edebilir. Bu özellik LiveData’nın sadece aktif yaşam döngüsündeki bileşenlerin gözlemleyicilerini güncelleştirmesini sağlar. Bu davranış, nesnenin sızmasının önlenmesini, uygulamanın olması gerekenden daha fazla iş yapmamasını ve ekran döndürme gibi durumlarda en son kaydedilen verilerin saklanmasını sağlar. Daha iyi anlamak için bir örnek yapalım.
Butona tıklandıkça TextView’deki değeri arttıran basit bir proje yapacağız. Yeni bir proje oluşturalım ve gradle dosyasının içerisine aşağıdaki satırları ekleyelim.
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="32dp"
android:text="Değeri Göster"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView" />
</androidx.constraintlayout.widget.ConstraintLayout>
UI tarafından ihtiyaç duyulan Observable değişkenler View Model içerisinden sağlanır. Bunun için View Model sınıfımızı oluşturalım.
package com.hktechnology.examples
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
class MainViewModel : ViewModel() {
private var count: Int = 0
val countLiveData: MutableLiveData<Int> by lazy() {
MutableLiveData<Int>()
}
fun getCount() {
count++
countLiveData.value = count
}
}
Sayı değerini tutmak için integer bir count değişkeni tanımlayalım. Daha sonra integer değeri tutmak için LiveData objesi oluşturalım. Oluşturduğumuz integer değişkeninin değerini arttırmak ve LiveData’nın içeriğini güncellemek için getCount() methodunu oluşturalım. Şimdi MainActivity’e geçebiliriz.
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
class MainActivity : AppCompatActivity() {
private lateinit var mainViewModel: MainViewModel
private lateinit var textView: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mainViewModel = ViewModelProvider(this@MainActivity).get(MainViewModel::class.java)
var button = findViewById<Button>(R.id.button)
textView = findViewById<TextView>(R.id.textView)
mainViewModel.countLiveData.observe(this, Observer {
textView.text = "$it"
})
button.setOnClickListener {
mainViewModel.getCount()
}
}
}
MainActivity içerisinden count değişkenine erişebilmek için View Model nesnesi oluşturmamız gerekir. Count değişkeninin değeri başlangıçta 0’dır ve butona tıklandığında getCount() methoduna erişilerek bu değer arttırılmaktadır. Count değişkeninde oluşan değişiklikleri gözlemlememiz gerekir. LiveData, count değişkeninin değerini gözlemler ve TextView’e atamamızı sağlar. Şimdi uygulamayı çalıştırıp test edebiliriz.
Gördüğünüz üzere ekranı döndürdüğümüzde count değeri değişmeyecektir.