नई परियोजना में वर्ग ViewModel का एक उदाहरण नहीं बना सकता

Nov 25 2020

मेरे दो अलग-अलग प्रोजेक्ट हैं। पहले एक में मैं अपनी गतिविधि और कक्ष डेटाबेस के साथ 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 का उपयोग बिल्कुल उसी तरह करता हूं (यहां तक ​​कि आयात भी समान हैं)। तो मुझे क्या करना होगा?

जवाब

1 AndrewChelix Nov 25 2020 at 11:52

आपके 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) }