Sobes.tech
Junior

Ispričaj mi o Jetpack ViewModel.

sobes.tech АИ

Одговор од АИ

ViewModel čuva i upravlja podacima povezanim sa UI-jem uzimajući u obzir životni ciklus. On preživljava promene konfiguracije (rotacije ekrana, promene rasporeda), sprečavajući gubitak podataka.

Ključne osobine:

  • Čuvanje podataka: ViewModel se ne uništava pri promenama konfiguracije, čuvajući stanje UI.
  • Odvajanje logike od UI: Poslovna logika se smešta u ViewModel, što olakšava testiranje i održavanje Activity/Fragment.
  • Integracija sa LiveData: Često se koristi sa LiveData za praćenje promena podataka.

Primer upotrebe:

// MyViewModel.kt
import androidx.lifecycle.ViewModel

class MyViewModel : ViewModel() {
    // Podaci koje je potrebno sačuvati pri promeni konfiguracije
    var counter = 0
}
// MyActivity.kt
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import androidx.lifecycle.ViewModelProvider

class MyActivity : AppCompatActivity() {
    private lateinit var viewModel: MyViewModel
    private lateinit var counterText: TextView
    private lateinit var incrementButton: Button

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Dobijanje ViewModel
        viewModel = ViewModelProvider(this).get(MyViewModel::class.java)

        counterText = findViewById(R.id.counter_text)
        incrementButton = findViewById(R.id.increment_button)

        // Prikaz podataka iz ViewModel
        updateCounterDisplay()

        incrementButton.setOnClickListener {
            viewModel.counter++
            updateCounterDisplay()
        }
    }

    private fun updateCounterDisplay() {
        counterText.text = viewModel.counter.toString()
    }
}

Život: ViewModel živi dok traje povezani Scope (npr. Activity). Kada Scope završi, ViewModel se uništava.

ViewModelProviders (sada ViewModelProvider) se koristio za dobijanje instance ViewModel pre Kotlin-a. U Kotlin-u se preporučuje koristiti ViewModelProvider(this).get(MyViewModel::class.java).

Glavne prednosti ViewModel-a u odnosu na obične klase za čuvanje UI stanja:

  • Preživljava promene konfiguracije.
  • Upravljan je od strane Jetpack-ovog okvira za životni ciklus.

Nedostaci:

  • Može postati prevelik kod složene UI logike.
  • Ne sme sadržavati reference na View, Context ili druge objekte sa životnim ciklusom, kako bi se izbegli curenja memorije.