не может быть предоставлено без конструктора @Inject или аннотированного метода @ Provides - PullRequest
0 голосов
/ 12 декабря 2018

Это мой класс компонента приложения

 @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();

}

@ Публичный класс модуля 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();
}

Инъекция в активности

@Inject @field:Named("activity")
lateinit var compositeDisposable: CompositeDisposable
@Inject
lateinit var averageViewModelFactory: AverageViewModelFactory
@Inject
lateinit var averageViewModel: AverageViewModel

Инъекция в виде модели фабрики

        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>(){

Градель

      //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'

Ошибка: [Dagger / MissingBinding] io.reactivex.Одноразовые. CompositeDisposable не может быть предоставлен без конструктора @Inject или метода, аннотированного @ Provides.открытый интерфейс AppComponent {^ io.reactivex.disposables.CompositeDisposable предоставляется по адресу com.sisindia.csat.deps.AppComponent.getCompositeDisposable (). Он также запрашивается по адресу: com.sisindia.csat.projectmodules.score.AverageViewModel (…) ComdisDisposisСледующие другие точки входа также зависят от него: com.sisindia.csat.deps.AppComponent.inject (com.sisindia.csat.projectmodules.score.AverageScoreActivity) com.sisindia.csat.deps.AppComponent.getVMCompositeDisposable ()

1 Ответ

0 голосов
/ 12 декабря 2018

Вам необходимо аннотировать CompositeDisposable с @Named в AppComponent и AverageViewModel классах, например:

public interface AppComponent {
    ...
    @Named("activity") CompositeDisposable getCompositeDisposable();
    @Named("vm") CompositeDisposable getVMCompositeDisposable(); 
}


class AverageViewModel @Inject constructor(
    ...
    @Named("vm") val compositeDisposable: CompositeDisposable
) : BaseViewModel<AverageInteractor.view>(){
...