Кинжал 2 не может сделать инъекцию конструктора - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть приложение с действиями и фрагментами с зависимостями, внедренными через кинжал 2 Я могу выполнять инъекцию полей в действиях и фрагментах, но не могу выполнить конструктор в других классах.Вот мой соответствующий код

@Module
public abstract class MainFragmentProvider {
  @ContributesAndroidInjector(modules = HomeFragmentModule.class)
  abstract HomeFragment provideHomeFragmentFactory();
}

и

@Module
public class HomeFragmentModule {
...
@Provides
 static HomePresenter provideHomePresenter(HomeView homeView, HomeInteractor homeInteractor) {
    return new HomePresenter(homeView, homeInteractor);
 }

Как я могу написать код, чтобы я мог получать зависимости непосредственно в HomePresenter путем внедрения конструктора вместо того, чтобы писать в модуле provideMethods.Я делаю это, потому что каждый раз, когда я хочу изменить аргументы конструктора в этом случае, мне нужно также изменить код модуля.

Как я могу сделать что-то подобное в конструкторе HomePresenter?

@Inject
public HomePresenter(HomeView homeView, HomeInteractor homeInteractor) {

    this.homeInteractor = homeInteractor;
    this.homeView = homeView;

}

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Я не знаю много о расширениях Android для Dagger 2, но, насколько я знаю, есть два способа достижения результата, который вы ищете.

В соответствующем компоненте вы можете указать методс вашим типом:

interface SomeComponent {
  HomePresenter presenter(); // Method name does not matter here, only the type
}

и обращайтесь к нему вот так

class Home {
  HomePresenter presenter;

  void initialize() { //This could be your onCreate or wherever you typically inject
    presenter = getSomeComponent().presenter();
  }
}

или вы можете запросить его, если укажете метод ввода для объекта Home:

interface SomeComponent {
  void inject(Home home);
}

class Home {
  @Inject HomePresenter presenter;

  void initialize(){
    getSomeComponent().inject(this);
  }
}

В обоих случаях вы должны убедиться, что ваш Component включает соответствующие Module s.

0 голосов
/ 20 сентября 2018

Чтобы внедрить конструктор, Даггер должен знать, где получить параметры, переданные ему, т.е. вы должны предоставить HomeView homeView, HomeInteractor homeInteractor

Так что создайте также методы для предоставления других зависимостей:

@Provides
 static HomeView provideHomeView() {
    return ...
 }

@Provides
 static HomeInteractor provideHomeInteractor() {
    return ...
 }
...