Why i don't inject in ViewModel i use Hilt for kotlin

@HiltViewModel
class PrincipalViewModel @Inject constructor(private val repository: PrincipalRepository) :ViewModel()

there is my binds

@Module
@InstallIn(ViewModelComponent::class)
abstract class ActivityModule {
    @Binds
    abstract fun bindPrincipalRepoImpl(repoImpl : PrincipalRepositoryImpl) : PrincipalRepository
}

And the error is

/Users/X/AndroidStudioProjects/Corotuines/app/build/generated/source/kapt/debug/com/example/corotuines/application/ApplicationMain_HiltComponents.java:126: error: [Dagger/MissingBinding] com.example.corotuines.repository.PrincipalRepositoryImpl cannot be provided without an @Inject constructor or an @Provides-annotated method. public abstract static class SingletonC implements ApplicationMain_GeneratedInjector, ^ com.example.corotuines.repository.PrincipalRepositoryImpl is injected at com.example.corotuines.di.ActivityModule.bindPrincipalRepoImpl(repoImpl) com.example.corotuines.repository.PrincipalRepository is injected at com.example.corotuines.viewmodel.PrincipalViewModel(repository) com.example.corotuines.viewmodel.PrincipalViewModel is injected at com.example.corotuines.viewmodel.PrincipalViewModel_HiltModules.BindsModule.binds(vm) @dagger.hilt.android.internal.lifecycle.HiltViewModelMap java.util.Map<java.lang.String,javax.inject.Provider<androidx.lifecycle.ViewModel>> is requested at dagger.hilt.android.internal.lifecycle.HiltViewModelFactory.ViewModelFactoriesEntryPoint.getHiltViewModelMap() [com.example.corotuines.application.ApplicationMain_HiltComponents.SingletonC → com.example.corotuines.application.ApplicationMain_HiltComponents.ActivityRetainedC → com.example.corotuines.application.ApplicationMain_HiltComponents.ViewModelC]

Upvotes: 0

Views: 397

Answers (1)

issamux
issamux

Reputation: 1415

If PrincipalRepository is an interface,your code will work. otherwise you should use :

 @Module
 @InstallIn(ViewModelComponent::class)
 object XYZModule {

 // with Potential dependencies if exists
 @Provides
 fun providePrincipalRepo(dep1:DEP1,dep2:DEP2): PrincipalRepository {
  return  PrincipalRepositoryImpl(dep1,dep2);
 }
}

Good luck

Upvotes: 0

Related Questions