डिपेंडेंसी के साथ ViewModel बनाना   Android Jetpack का हिस्सा.

डिपेंडेंसी इंजेक्शन's के सबसे सही तरीकों का पालन करते हुए, ViewModels अपने कंस्ट्रक्टर में पैरामीटर के तौर पर डिपेंडेंसी ले सकते हैं. ये ज़्यादातर डोमेन या डेटा लेयर के टाइप होते हैं. फ़्रेमवर्क, ViewModels उपलब्ध कराता है. इसलिए, इनके इंस्टेंस बनाने के लिए एक खास तरीके की ज़रूरत होती है. यह ViewModelProvider.Factory इंटरफ़ेस है. सिर्फ़ इस इंटरफ़ेस को लागू करने वाले ऑब्जेक्ट, सही स्कोप में ViewModels को इंस्टैंशिएट कर सकते हैं.

CreationExtras के साथ ViewModels

अगर किसी ViewModel क्लास को उसके कंस्ट्रक्टर में डिपेंडेंसी मिलती हैं, तो ViewModelProvider.Factory इंटरफ़ेस को लागू करने वाली फ़ैक्ट्री उपलब्ध कराएं. ViewModel का नया इंस्टेंस उपलब्ध कराने के लिए, create(Class<T>, CreationExtras) फ़ंक्शन को बदलें.

CreationExtras की मदद से, काम की जानकारी ऐक्सेस की जा सकती है. इससे ViewModel को इंस्टैंटिएट करने में मदद मिलती है. यहां उन कुंजियों की सूची दी गई है जिन्हें अतिरिक्त जानकारी से ऐक्सेस किया जा सकता है:

कुंजी फ़ंक्शनलिटी
ViewModelProvider.NewInstanceFactory.VIEW_MODEL_KEY यह कुकी, ViewModelProvider.get() को पास की गई कस्टम कुंजी का ऐक्सेस देती है.
ViewModelProvider.AndroidViewModelFactory.APPLICATION_KEY Application क्लास के इंस्टेंस का ऐक्सेस देता है.
SavedStateHandleSupport.DEFAULT_ARGS_KEY यह आर्ग्युमेंट के बंडल का ऐक्सेस देता है. इसका इस्तेमाल करके, आपको SavedStateHandle बनाना चाहिए.
SavedStateHandleSupport.SAVED_STATE_REGISTRY_OWNER_KEY यह उस SavedStateRegistryOwner का ऐक्सेस देता है जिसका इस्तेमाल ViewModel बनाने के लिए किया जा रहा है.
SavedStateHandleSupport.VIEW_MODEL_STORE_OWNER_KEY यह उस ViewModelStoreOwner का ऐक्सेस देता है जिसका इस्तेमाल ViewModel बनाने के लिए किया जा रहा है.

SavedStateHandle का नया इंस्टेंस बनाने के लिए, CreationExtras.createSavedStateHandle() फ़ंक्शन का इस्तेमाल करें और इसे ViewModel को पास करें.

APPLICATION_KEY के साथ CreationExtras

यहां ViewModel का एक इंस्टेंस देने का तरीका बताया गया है. यह Application क्लास के स्कोप में मौजूद repository और SavedStateHandle को डिपेंडेंसी के तौर पर लेता है:

    import androidx.lifecycle.SavedStateHandle
    import androidx.lifecycle.ViewModel
    import androidx.lifecycle.ViewModelProvider
    import androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory.Companion.APPLICATION_KEY
    import androidx.lifecycle.createSavedStateHandle
    import androidx.lifecycle.viewmodel.initializer
    import androidx.lifecycle.viewmodel.viewModelFactory

    class MyViewModel(
        private val myRepository: MyRepository,
        private val savedStateHandle: SavedStateHandle
    ) : ViewModel() {

        // ViewModel logic
        // ...

        // Define ViewModel factory in a companion object
        companion object {

            val Factory: ViewModelProvider.Factory = viewModelFactory {
                initializer {
                    val savedStateHandle = createSavedStateHandle()
                    val myRepository = (this[APPLICATION_KEY] as MyApplication).myRepository
                    MyViewModel(
                        myRepository = myRepository,
                        savedStateHandle = savedStateHandle
                    )
                }
            }
        }
    }

इसके बाद, ViewModel का इंस्टेंस वापस पाने के लिए, इस फ़ैक्ट्री का इस्तेमाल किया जा सकता है:

import androidx.lifecycle.viewmodel.compose.viewModel

@Composable
fun MyScreen(
    modifier: Modifier = Modifier,
    viewModel: MyViewModel = viewModel(factory = MyViewModel.Factory)
) {
    // ...
}

कस्टम पैरामीटर को CreationExtras के तौर पर पास करना

कस्टम कुंजी बनाकर, CreationExtras के ज़रिए अपनी ViewModel को डिपेंडेंसी पास की जा सकती हैं. अगर आपका ViewModel उन ऑब्जेक्ट पर निर्भर करता है जिन्हें Application क्लास और APPLICATION_KEY के ज़रिए ऐक्सेस नहीं किया जा सकता, तो यह तरीका फ़ायदेमंद हो सकता है. इसका एक उदाहरण यह है कि जब आपका ViewModel, Kotlin Multiplatform मॉड्यूल में बनाया जाता है और इसलिए, उसके पास Android डिपेंडेंसी का ऐक्सेस नहीं होता है.

इस उदाहरण में, ViewModel एक कस्टम कुंजी तय करता है और इसका इस्तेमाल ViewModelProvider.Factory में करता है.

import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
import androidx.lifecycle.viewmodel.CreationExtras
import androidx.lifecycle.viewmodel.initializer
import androidx.lifecycle.viewmodel.viewModelFactory

class MyViewModel(
    private val myRepository: MyRepository,
) : ViewModel() {
    // ViewModel logic

    // Define ViewModel factory in a companion object
    companion object {

        // Define a custom key using the factory function
        val MY_REPOSITORY_KEY = CreationExtras.Key<MyRepository>()

        val Factory: ViewModelProvider.Factory = viewModelFactory {
            initializer {
                // Get the dependency in your factory
                val myRepository = this[MY_REPOSITORY_KEY] as MyRepository
                MyViewModel(
                    myRepository = myRepository,
                )
            }
        }
    }
}

अपने कंपोज़ेबल में सीधे तौर पर CreationExtras.Key की मदद से ViewModel को इंस्टैंशिएट किया जा सकता है.

import androidx.lifecycle.viewmodel.MutableCreationExtras
import androidx.lifecycle.viewmodel.compose.viewModel
// ...
@Composable
fun MyApp(myRepository: MyRepository) {
    val extras = MutableCreationExtras().apply {
        set(MyViewModel.MY_REPOSITORY_KEY, myRepository)
    }
    val viewModel: MyViewModel = viewModel(
        factory = MyViewModel.Factory,
        extras = extras,
    )
}

अन्य संसाधन

ViewModels और डिपेंडेंसी के बारे में ज़्यादा जानने के लिए, यहां दिए गए अतिरिक्त संसाधन देखें:

दस्तावेज़

कॉन्टेंट देखता है