Sobes.tech
Junior

Дар бораи Jetpack ViewModel ба ман нақл кунед.

sobes.tech AI

Ҷавоб аз AI

ViewModel нигоҳ медорад ва идора мекунад маълумотҳои вобаста ба UI бо дарназардошти давраи ҳаёти. Он аз тағиротҳои конфигуратсия (тарроҳии экран, тағирот дар тартиб) гузашта, аз гум шудани маълумотҳо пешгирӣ мекунад.

Хусусиятҳои асосӣ:

  • Захира кардани маълумот: ViewModel дар тағиротҳои конфигуратсия нест мешавад, ҳолати UI-ро нигоҳ медорад.
  • Ҷудо кардани логика аз UI: Логикаи бизнес дар ViewModel ҷойгир мешавад, ки имкон медиҳад тест ва нигоҳдории Activity/Fragment осонтар шавад.
  • Интегратсия бо LiveData: Баъзан бо LiveData барои назорат кардани тағиротҳои маълумот истифода мешавад.

Масалан истифода:

// MyViewModel.kt
import androidx.lifecycle.ViewModel

class MyViewModel : ViewModel() {
    // Маълумотҳое, ки бояд дар тағиротҳои конфигуратсия нигоҳ дошта шаванд
    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)

        // Дастрасӣ ба ViewModel
        viewModel = ViewModelProvider(this).get(MyViewModel::class.java)

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

        // Намоиши маълумот аз ViewModel
        updateCounterDisplay()

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

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

Мӯҳлат: ViewModel то он вақт зинда мемонад, ки Scope (масалан, Activity) зинда бошад. Вақте Scope ба охир мерасад, ViewModel нобуд мешавад.

ViewModelProviders (ҳоло ViewModelProvider) барои гирифтани намунаи ViewModel пеш аз Kotlin истифода мешуд. Дар Kotlin тавсия дода мешавад, ки ViewModelProvider(this).get(MyViewModel::class.java) истифода шавад.

Бартариҳои асосии ViewModel нисбат ба синфҳои оддӣ барои нигоҳ доштани ҳолати UI:

  • Аз тағиротҳои конфигуратсия гузашта метавонад.
  • Аз ҷониби рамзи ҳаёти Jetpack идора мешавад.

Норасоиҳо:

  • Мумкин аст, ки дар сурати логикаи мураккаб дар UI, хеле калон шавад.
  • Маҳз набояд дорои истинодҳо ба View, Context ё объектҳои дигар бо ҳаёти цикл бошад, то аз дардҳои хотира пешгирӣ шавад.