Dagger использование Inject

третий день не могу разобраться с даггером, а именно с использованием Inject. UseCase класс:

 public class UseCase {
    @Inject
    Repo repo;
    
    public void getText() {
        repo.repoText();
    }
}

Repo Класс:

public class Repo {
    @Inject
    Data data;

    public void repoText(){
        data.getDataText();
    }
}

Data класс:

public class Data {
  
    public void getDataText(){
        System.out.println("ДАТА ТЕКСТ");
    }
}

Модуль:

@Module
public class AppModule {

    @Provides
    UseCase useCase(){
        return new UseCase();
    }

    @Provides
    Repo repo(){
        return new Repo();
    }

    @Provides
    Data providesData(){
        return new Data();
    }
}

Компонент:

@Component(modules = AppModule.class)
public interface AppComponent {
    UseCase getUseCase();
    void inject(UseCase useCase);
}

И реализация:

AppComponent appComponent = DaggerAppComponent.create();
    UseCase useCase = appComponent.getUseCase();
    appComponent.inject(useCase);
    useCase.getText();

Проблема в том, что не создается класс Data который реализуется в классе Repo. Что я делаю не так? Заранее спасибо за ответ


Ответы (2 шт):

Автор решения: Shams

Проблема в том что dagger не может инжектит data класс в repo, так как вы не прописали inject метод в AppComponent. Лучше передайте data класс в конструктор repo. Тогда проблем не возникнет

public class Repo {
    Data data;

    public Repo(Data data) {
        this.data = data;
    }

    public void repoText() {
        data.getDataText();
    }
}
→ Ссылка
Автор решения: IR42

Используйте Inject на конструкторе, а не на поле

public class UseCase {
    
    Repo repo;

    @Inject
    public UseCase(Repo repo) {
        this.repo = repo;
    }
    public void getText() {
        repo.repoText();
    }
}

Repo Класс:

public class Repo {
    Data data;

    @Inject
    public Repo(Data data) {
        this.data = data;
    }

    public void repoText(){
        data.getDataText();
    }
}

Data класс:

public class Data {
  
    @Inject
    public Data() {}

    public void getDataText(){
        System.out.println("ДАТА ТЕКСТ");
    }
}

Компонент:

@Component
public interface AppComponent {
    UseCase getUseCase();
}

AppComponent appComponent = DaggerAppComponent.create();
    UseCase useCase = appComponent.getUseCase();
    useCase.getText();

→ Ссылка