0

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) 
Farmer
  • 4,093
  • 3
  • 23
  • 47

3 Answers3

1

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)

Amit Soni
  • 71
  • 6
1

Caused by: java.lang.InstantiationException: java.lang.Class<com.vision.movies.viewModel.LoginViewModel> has no zero argument constructor

This means that the framework expects LoginViewModel (and any other view model) to have a 0 argument constructor. You don't, so it crashes. It isn't found at compile time most likely due to a use of reflection

Gabe Sechan
  • 90,003
  • 9
  • 87
  • 127
  • Thanks, As you informed I have removed argument from `ViewModel` constructor and its working charms. I have done like this `class LoginViewModel : ViewModel() {}` – Farmer Apr 04 '23 at 07:24
0

injecting the context into the viewModel is not a good idea, if you really need to access the context in the viewModel extend AndroidViewModel

check this question

Raafat Alhmidi
  • 1,106
  • 12
  • 18