I am creating a multi module android app with clean architecture layers as modules:
root >
app (main module)
presentation (android lib module) //it has dependency on domain in build.gradle
domain (android lib module)
data (android lib module) //it has dependency on domain in build.gradle
Domain module has UseCase and Repository interface like:
package com.cleanarchitecturesample.domain.usecase.user
class SaveUserUseCase @Inject constructor(
private val repository: UserCredentialsRepository,
@IO private val dispatcher: CoroutineDispatcher
) {
...
}
package com.cleanarchitecturesample.domain.respository
interface UserCredentialsRepository {
...
}
and the implementation of Repository & its di is placed in Data module with data sources like:
package com.cleanarchitecturesample.data.repoimpl
import com.cleanarchitecturesample.data.source.local.UserCredentialsLDS
import com.cleanarchitecturesample.domain.respository.UserCredentialsRepository
class UserCredentialsRepositoryImpl(
private val userCredentialsLDS: UserCredentialsLDS
) : UserCredentialsRepository {
...
}
package com.cleanarchitecturesample.data.di
import com.cleanarchitecturesample.data.repoimpl.UserCredentialsRepositoryImpl
import com.cleanarchitecturesample.data.source.local.UserCredentialsLDS
import com.cleanarchitecturesample.domain.respository.UserCredentialsRepository
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton
@Module
@InstallIn(SingletonComponent::class)
object RepositoryModule {
@Singleton
@Provides
fun provideUserCredentialsRepository(
userCredentialsLDS: UserCredentialsLDS
): UserCredentialsRepository = UserCredentialsRepositoryImpl(userCredentialsLDS)
}
Everything seems to be fine but still I am getting following error:
/AndroidStudioProjects/CleanArchitectureSample/app/build/generated/hilt/component_sources/debug/com/cleanarchitecturesample/app/CleanArchitectureApp_HiltComponents.java:137: error: [Dagger/MissingBinding] com.cleanarchitecturesample.domain.respository.UserCredentialsRepository cannot be provided without an @Provides-annotated method. public abstract static class SingletonC implements CleanArchitectureApp_GeneratedInjector, ^ com.cleanarchitecturesample.domain.respository.UserCredentialsRepository is injected at com.cleanarchitecturesample.domain.usecase.user.IsValidUserCredentialsUseCase(repository, …) com.cleanarchitecturesample.domain.usecase.user.IsValidUserCredentialsUseCase is injected at com.cleanarchitecturesample.presentation.vm.UserAuthenticationVM(…, isValidUserCredentialsUseCase, …) com.cleanarchitecturesample.presentation.vm.UserAuthenticationVM is injected at com.cleanarchitecturesample.presentation.vm.UserAuthenticationVM_HiltModules.BindsModule.binds(arg0) @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.cleanarchitecturesample.app.CleanArchitectureApp_HiltComponents.SingletonC → com.cleanarchitecturesample.app.CleanArchitectureApp_HiltComponents.ActivityRetainedC → com.cleanarchitecturesample.app.CleanArchitectureApp_HiltComponents.ViewModelC] It is also requested at: com.cleanarchitecturesample.domain.usecase.user.SaveUserUseCase(repository, …)
Note: I have also tried di for Repository using the abstract class and binds syntax with even that was showing the same error.
Any help would be appriciated. Thanks in Advance!! :)
Add data
module as a dependency of app
module.
Dagger generated codes stay in app
module as such if you don't set data
module as a dependency dagger won't be able to access your RepositoryModule