Reputation: 1
This my App Component class
@Singleton
@Component(dependencies = {}, modules = {AppModule.class,RoomModule.class, NetworkModule.class})
public interface AppComponent {
void inject(CSATApplication applicationController);
void inject(AverageScoreActivity averageScoreActivity);
CsatDao csaatdao();
CSATDatabase csatDatabase();
RemoteRepositoryImpl getRemoteRepo();
LocalRepositoryImpl getLocalRepo();
Application application();
BaseUrlHolder provideBaseUrlHolder();
Retrofit getRetrofit();
CompositeDisposable getCompositeDisposable();
CompositeDisposable getVMCompositeDisposable();
}
@Module public class RoomModule {
private CSATDatabase CSATDatabase;
public RoomModule(Application mApplication) {
CSATDatabase = Room.databaseBuilder(mApplication, CSATDatabase.class, AppConstants.DATABASE_NAME).build();
}
@Singleton
@Provides
CSATDatabase providesRoomDatabase() {
return CSATDatabase;
}
@Singleton
@Provides
CsatDao providesCsatDao(CSATDatabase CSATDatabase) {
return CSATDatabase.getCsatDao();
}
@Singleton
@Provides
public RemoteRepository getRemoteRepo(NetworkService networkService){
return new RemoteRepositoryImpl(networkService);
}
@Singleton
@Provides
public LocalRepository getLocalRepo(CsatDao csatDao, Executor exec){
return new LocalRepositoryImpl(csatDao, exec);
}
@Provides
@Named("activity")
public CompositeDisposable getCompositeDisposable(){
return new CompositeDisposable();
}
@Provides
@Named("vm")
public CompositeDisposable getVMCompositeDisposable(){
return new CompositeDisposable();
}
Injecting in activity
@Inject @field:Named("activity")
lateinit var compositeDisposable: CompositeDisposable
@Inject
lateinit var averageViewModelFactory: AverageViewModelFactory
@Inject
lateinit var averageViewModel: AverageViewModel
Injecting In View Model Factory
class AverageViewModelFactory @Inject
constructor() : @JvmSuppressWildcards ViewModelProvider.Factory {
@Inject
lateinit var localRepository: LocalRepository
@Inject
lateinit var remoteRepository: RemoteRepository
@Inject @field:Named("vm")
lateinit var compositeDisposable: CompositeDisposable
@Override
override fun <T : ViewModel> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(AverageViewModel::class.java)) {
return AverageViewModel(localRepository, remoteRepository, compositeDisposable) as T
}
throw IllegalArgumentException("Wrong ViewModel class")
}
}
class AverageViewModel @Inject constructor(
val localRepository: LocalRepository,
val remoteRepository: RemoteRepository,
val compositeDisposable: CompositeDisposable
) : BaseViewModel<AverageInteractor.view>(){
Gradel
//Dependencies injection
implementation 'com.google.dagger:dagger:2.19'
implementation 'com.google.dagger:dagger-android:2.19'
kapt 'com.google.dagger:dagger-compiler:2.19'
annotationProcessor 'com.google.dagger:dagger-compiler:2.19'
kapt 'com.google.dagger:dagger-android-processor:2.19'
compileOnly 'javax.annotation:jsr250-api:1.0'
Error error: [Dagger/MissingBinding] io.reactivex.disposables.CompositeDisposable cannot be provided without an @Inject constructor or an @Provides-annotated method. public interface AppComponent { ^ io.reactivex.disposables.CompositeDisposable is provided at com.sisindia.csat.deps.AppComponent.getCompositeDisposable() It is also requested at: com.sisindia.csat.projectmodules.score.AverageViewModel(…, compositeDisposable) The following other entry points also depend on it: com.sisindia.csat.deps.AppComponent.inject(com.sisindia.csat.projectmodules.score.AverageScoreActivity) com.sisindia.csat.deps.AppComponent.getVMCompositeDisposable()
Upvotes: 0
Views: 1235
Reputation: 896
You need to annotate your CompositeDisposable
's with @Named
in AppComponent
and AverageViewModel
classes, like this:
public interface AppComponent {
...
@Named("activity") CompositeDisposable getCompositeDisposable();
@Named("vm") CompositeDisposable getVMCompositeDisposable();
}
class AverageViewModel @Inject constructor(
...
@Named("vm") val compositeDisposable: CompositeDisposable
) : BaseViewModel<AverageInteractor.view>(){
Upvotes: 0