Search code examples
androidkotlinmvvmviewmodel

Cannot create an instance of class ViewModel or has no zero argument constructor in Kotlin


I have checked these are the question and answer but still not getting solution Question 1, Question 2, Question 3, Question 4, Question 5, Question 6 and also checked some of the article.

This is my Factory class

class ContextViewModelFactory (private val context: Context) :
    ViewModelProvider.AndroidViewModelFactory() {

    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        if (modelClass.isAssignableFrom(LoginViewModel::class.java)) {
            return LoginViewModel(context) as T
        }
        throw IllegalArgumentException("Unknown class name")
    }
}

This is ViewModel class

class LoginViewModel (val context : Context) : ViewModel() {

    var isTask = MutableLiveData<Boolean>()
}

This is Activity class

class ActivityLogin : BaseActivity() {

    lateinit var binding: ActivityLoginBinding
    lateinit var viewModel: LoginViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityLoginBinding.inflate(layoutInflater)
        setContentView(binding.root)
        observer()
    }

    private fun initViewModel() {
        viewModel = ViewModelProvider(this,
            ContextViewModelFactory(this@ActivityLogin))[LoginViewModel::class.java]
        binding.model = viewModel
        binding.lifecycleOwner = this
    }
}

I have tried so much but not solver, do some help that where I am doing something wrong, Thanks.

Below is the error log

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.vision.movies/com.vision.movies.view.ActivityLogin}: java.lang.RuntimeException: Cannot create an instance of class com.vision.movies.viewModel.LoginViewModel
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2861)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2943)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1630)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6626)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:811)
     Caused by: java.lang.RuntimeException: Cannot create an instance of class com.vision.movies.viewModel.LoginViewModel
        at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.kt:204)
        at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:322)
        at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:282)
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:187)
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:153)
        at com.vision.movies.view.ActivityLogin.initViewModel(ActivityLogin.kt:29)
        at com.vision.movies.view.ActivityLogin.onCreate(ActivityLogin.kt:23)
        at android.app.Activity.performCreate(Activity.java:7032)
        at android.app.Activity.performCreate(Activity.java:7023)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1236)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2814)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2943) 
        at android.app.ActivityThread.-wrap11(Unknown Source:0) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1630) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6626) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:811) 
     Caused by: java.lang.InstantiationException: java.lang.Class<com.vision.movies.viewModel.LoginViewModel> has no zero argument constructor
        at java.lang.Class.newInstance(Native Method)
        at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.kt:202)
        at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:322) 
        at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:282) 
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:187) 
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:153) 
        at com.vision.movies.view.ActivityLogin.initViewModel(ActivityLogin.kt:29) 
        at com.vision.movies.view.ActivityLogin.onCreate(ActivityLogin.kt:23) 
        at android.app.Activity.performCreate(Activity.java:7032) 
        at android.app.Activity.performCreate(Activity.java:7023) 
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1236) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2814) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2943) 
        at android.app.ActivityThread.-wrap11(Unknown Source:0) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1630) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6626) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:811) 

Solution

  • Please use below code to initialize viewmodel.

    viewModel = ViewModelProviders.of(this).get(LoginViewModel::class.java)

    If it not works try below code

    viewModel = ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory.getInstance(this.getApplication())).get(LoginViewModel::class.java)