डिपेंडेंसी के साथ 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 और डिपेंडेंसी के बारे में ज़्यादा जानने के लिए, यहां दिए गए अतिरिक्त संसाधन देखें:
दस्तावेज़
कॉन्टेंट देखता है
आपके लिए सुझाव
- ध्यान दें: JavaScript बंद होने पर लिंक का टेक्स्ट दिखता है
- ViewModel के लिए Saved State मॉड्यूल
- यूज़र इंटरफ़ेस (यूआई) की स्थितियां सेव करना