Sobes.tech
Junior

дар бораи Jetpack ViewModel гап зан.

sobes.tech AI

Ҷавоб аз AI

ViewModel — компоненти Jetpack, ки барои нигоҳ доштани маълумот ва идоракунии он бо роҳи, ки бо UI алоқаманд аст, пешбинӣ шудааст. Ҳадафи асосии он нигоҳ доштани маълумоти UI дар вақти тағироти конфигуратсия, масалан, гардиши экран, ва гузаштан аз давраи ҳаёти Activity ё Fragment мебошад.

Хусусиятҳои ViewModel:

  • Нигоҳдории маълумот: Он тағироти конфигуратсия ва ҳатто марготи Activity/Fragment-ро пас мебарад, маълумотҳоро ҳангоми дубора сохтан барқарор мекунад.
  • Ҷудо кардани логика: Логикаи омодасозии маълумот барои UI аз худ UI (Activity/Fragment) ҷудо мекунад.
  • Бо давраи ҳаёт алоқаманд: Бо давраи ҳаёти Activity ё Fragment пайваст аст.
  • Пешгирии шикастани хотира: Ба View, Lifecycle ё Activity/Fragment мустақиман ишора надорад, ки шикастани хотираро пешгирӣ мекунад.

Чӣ гуна истифода бурдан:

  1. Классеро эҷод кунед, ки аз ViewModel мерос мегирад.

    class MyViewModel : ViewModel() {
        private val _data = MutableLiveData<String>()
        val data: LiveData<String> = _data
    
        init {
            // Инициализацияи маълумот
        }
    
        fun fetchData() {
            // Логикаи боркунии маълумот
            _data.value = "Маълумоти боркашӣшуда"
        }
    
        override fun onCleared() {
            // Тозакунии манбаъҳо
            super.onCleared()
        }
    }
    
  2. Нусхаи ViewModel-ро дар Activity ё Fragment гиред.

    class MyActivity : AppCompatActivity() {
        private lateinit var viewModel: MyViewModel
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
    
            viewModel.data.observe(this, Observer { newData ->
                // Навсозии UI
            })
    
            viewModel.fetchData()
        }
    }
    
  3. Барои эҷоди нусхаҳои ViewModel бо вобастагиҳо ViewModelProvider.Factory-ро истифода баред.

    class MyViewModel(private val repository: MyRepository) : ViewModel() {
        // ...
    }
    
    class MyViewModelFactory(private val repository: MyRepository) : ViewModelProvider.Factory {
        override fun <T : ViewModel> create(modelClass: Class<T>): T {
            if (modelClass.isAssignableFrom(MyViewModel::class.java)) {
                @Suppress("UNCHECKED_CAST")
                return MyViewModel(repository) as T
            }
            throw IllegalArgumentException("Класси номаълум ViewModel")
        }
    }
    
    // Дар Activity/Fragment
    // val repository = MyRepository() // Вобастагиро ворид кунед
    // viewModel = ViewModelProvider(this, MyViewModelFactory(repository)).get(MyViewModel::class.java)
    

Мувофиқсозӣ бо onSaveInstanceState():

Хусусият ViewModel onSaveInstanceState()
Пайдоиши конфигуратсия Бале Бале (барои маълумоти хурд)
Пайдоиши раванди Не (пас аз қатъ шудани раванди маълумотҳо гум мешаванд) Бале (барои маълумоти хурд)
Нигоҳдории маълумот Объектҳо, LiveData Bundle (примитивҳо, Serializable, Parcelable)
Шикастани хотираҳо Не (агар дуруст истифода шавад) Мумкин аст, агар ишораҳо ба Activity/View нигоҳ дошта шаванд
Суръати иҷроиш Муҳитҳои содда бештар мураккаб мешавад Осонтар барои сценарийҳои содда

ViewModel кӯмак мекунад, ки барномаҳои устувор ва осонтар тестшаванда созанд, UI-ро аз логикаи коркарди маълумот ҷудо мекунад.