DaggerHilt: Cannot create an instance of class ViewModel

46 views Asked by At

I have a class that implements an interface

interface Sample {
    fun a()
}

class StandardSample @Inject constructor() : Sample {
    override fun a() {
    }
}

I have a module for this class:

@Module
@InstallIn(ViewModelComponent::class)
interface SampleModule {
    @Binds
    fun bindSample(sample: StandardSample) : Sample
}

I use this class in a ViewModel:

@HiltViewModel
class BlankViewModel @Inject constructor(sample: Sample) : ViewModel() {
    fun a() {
    }
}

The viewmodel is initialized in a fragment like this:
private val viewModel: BlankViewModel by hiltNavGraphViewModels(R.id.main_navigation)
And it works. However, as far as I'm aware, if I initialize it this way, the ViewModel is scoped to the navigation graph. I want the ViewModel to be destroyed alongside with the fragment it was called from. To achieve that, I wanted to use

@AndroidEntryPoint
class BlankFragment : Fragment() {

    private val viewModel : BlankViewModel by viewModels()

However, this led to an error: Cannot create an instance of class *KeyNotesViewModel as soon as I open the fragment. How do I initialize a ViewModel scoped to a fragment using Hilt?
The stacktrace:

FATAL EXCEPTION: main
    Process: com.example.greatapp, PID: 26166
    java.lang.RuntimeException: Cannot create an instance of class com.example.greatapp.BlankViewModel
        at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.kt:204)
        at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:324)
        at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:306)
        at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:280)
        at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.kt:128)
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:187)
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:153)
        at androidx.lifecycle.ViewModelLazy.getValue(ViewModelLazy.kt:53)
        at androidx.lifecycle.ViewModelLazy.getValue(ViewModelLazy.kt:35)
        at com.example.greatapp.BlankFragment.getViewModel(BlankFragment.kt:14)
        at com.example.greatapp.BlankFragment.onViewCreated(BlankFragment.kt:25)
        at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:3147)
        at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:588)
        at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:272)
        at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:114)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1455)
        at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3034)
        at androidx.fragment.app.FragmentManager.dispatchViewCreated(FragmentManager.java:2945)
        at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:3148)
        at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:588)
        at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:272)
        at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:114)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1455)
        at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3034)
        at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2952)
        at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:263)
        at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:350)
        at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:251)
        at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1425)
        at android.app.Activity.performStart(Activity.java:7825)
        at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3294)
        at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221)
        at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201)
        at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
    Caused by: java.lang.NoSuchMethodException: com.example.greatapp.BlankViewModel.<init> []
        at java.lang.Class.getConstructor0(Class.java:2332)
        at java.lang.Class.getDeclaredConstructor(Class.java:2170)
        at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.kt:202)
        at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:324) 
        at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:306) 
        at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.kt:280) 
        at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.kt:128) 
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:187) 
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.kt:153) 
        at androidx.lifecycle.ViewModelLazy.getValue(ViewModelLazy.kt:53) 
        at androidx.lifecycle.ViewModelLazy.getValue(ViewModelLazy.kt:35) 
        at com.example.greatapp.BlankFragment.getViewModel(BlankFragment.kt:14) 
        at com.example.greatapp.BlankFragment.onViewCreated(BlankFragment.kt:25) 
        at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:3147) 
        at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:588) 
        at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:272) 
        at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:114) 
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1455) 
        at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3034) 
        at androidx.fragment.app.FragmentManager.dispatchViewCreated(FragmentManager.java:2945) 
        at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:3148) 
        at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:588) 
        at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:272) 
        at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:114) 
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1455) 
        at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3034) 
        at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2952) 
        at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:263) 
        at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:350) 
        at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:251) 
        at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1425) 
        at android.app.Activity.performStart(Activity.java:7825) 
        at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3294) 
        at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221) 
        at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201) 
        at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) 
        at android.os.Handler.dispatchMessage(Handler.java:107) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.app.ActivityThread.main(ActivityThread.java:7356) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) 
0

There are 0 answers