नई परियोजना में वर्ग ViewModel का एक उदाहरण नहीं बना सकता
मेरे दो अलग-अलग प्रोजेक्ट हैं। पहले एक में मैं अपनी गतिविधि और कक्ष डेटाबेस के साथ ViewModel का उपयोग करता हूं। सब कुछ काम करता है। फिर मैंने बस अलग-अलग उद्देश्यों के लिए नई परियोजना बनाई और वहां मैंने ViewModel को बिल्कुल उसी तरह से तैयार किया, लेकिन मेरा ऐप इस त्रुटि के साथ क्रैश हो गया:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example/com.example.MainActivity}: java.lang.RuntimeException: Cannot create an instance of class com.example.MainViewModel
at android.app.ActivityThread.performLaunchActivity(Unknown Source:591)
at android.app.ActivityThread.handleLaunchActivity(Unknown Source:36)
at android.app.servertransaction.LaunchActivityItem.execute(Unknown Source:57)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(Unknown Source:99)
at android.app.servertransaction.TransactionExecutor.execute(Unknown Source:34)
at android.app.ActivityThread$H.handleMessage(Unknown Source:36) at android.os.Handler.dispatchMessage(Unknown Source:21) at android.os.Looper.loop(Unknown Source:207) at android.app.ActivityThread.main(Unknown Source:107) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(Unknown Source:11)
at com.android.internal.os.ZygoteInit.main(Unknown Source:274)
Caused by: java.lang.RuntimeException: Cannot create an instance of class com.example.MainViewModel
at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:221) at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:187) at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150) at com.kazguiu.MainActivity.applyAdapterAndViewModel(MainActivity.kt:37) at com.kazguiu.MainActivity.onCreate(MainActivity.kt:25) at android.app.Activity.performCreate(Unknown Source:16) at android.app.Activity.performCreate(Unknown Source:1) at android.app.Instrumentation.callActivityOnCreate(Unknown Source:3) at android.app.ActivityThread.performLaunchActivity(Unknown Source:368) at android.app.ActivityThread.handleLaunchActivity(Unknown Source:36) at android.app.servertransaction.LaunchActivityItem.execute(Unknown Source:57) at android.app.servertransaction.TransactionExecutor.executeCallbacks(Unknown Source:99) at android.app.servertransaction.TransactionExecutor.execute(Unknown Source:34) at android.app.ActivityThread$H.handleMessage(Unknown Source:36)
at android.os.Handler.dispatchMessage(Unknown Source:21)
at android.os.Looper.loop(Unknown Source:207)
at android.app.ActivityThread.main(Unknown Source:107)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(Unknown Source:11) at com.android.internal.os.ZygoteInit.main(Unknown Source:274) Caused by: java.lang.InstantiationException: java.lang.Class<com.example.MainViewModel> has no zero argument constructor at java.lang.Class.newInstance(Native Method) at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:219)
मैं इस तरह की गतिविधि में ViewModel को तत्काल:
private lateinit var mainViewModel: MainViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
applyAdapterAndViewModel()
}
private fun applyAdapterAndViewModel() {
mainViewModel = ViewModelProvider(this).get(MainViewModel::class.java)
}
मेरा दृश्यमॉडल:
class MainViewModel(application: Application) : AndroidViewModel(application) {
private val exampleDao = Database.getDatabase(application).exampleDao()
private val repository = Repository(exampleDao)
fun getSubjects() = repository.getSubjects()
fun addSubjects(subject: Subjects) = viewModelScope.launch(Dispatchers.IO) {
repository.addSubject(subject)
}
}
ViewModel का उपयोग करने का यह तरीका मेरी पिछली परियोजना के समान है। केवल अंतर यह है कि मेरे वर्तमान ग्रेडल में मेरी दो अतिरिक्त निर्भरताएँ हैं:
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.2.0'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0'
यदि मैं उन्हें हटा देता हूं, तो Android Studio ViewModelProvider को नहीं पहचानता है, लेकिन मेरी पिछली परियोजनाओं में ये निर्भरता बिल्कुल नहीं है और मैं LiveData और ViewModel का उपयोग बिल्कुल उसी तरह करता हूं (यहां तक कि आयात भी समान हैं)। तो मुझे क्या करना होगा?
जवाब
आपके ViewModel को एक तर्क की आवश्यकता होती है application: Application
जिसे केवल ViewModelFactory का उपयोग करके प्रदान किया जा सकता है:
ViewModelFactory
class MainViewModelFactory(
private val application: Application
) : ViewModelProvider.Factory {
@Suppress("unchecked_cast")
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(MainViewModel::class.java)) {
return MainViewModel(application) as T
}
throw IllegalArgumentException("Unknown ViewModel class")
}
}
मुख्य गतिविधि
private fun applyAdapterAndViewModel() {
// Not so kotlinic
mainViewModel = ViewModelProvider(this,MainViewModelFactory(application)).get(MainViewModel::class.java)
}
इसके अलावा, MainActivity में, के private lateinit var mainViewModel: MainViewModel
साथ बदलें
private val viewModel by viewModels<MainViewModel> {
MainViewModelFactory(application) }