Можно ли внедрить элемент поля с помощью Dagger только с помощью конструктора - PullRequest
0 голосов
/ 30 мая 2019

Я добавляю элемент поля следующим образом:

@Inject
lateinit var repository: Repository

Что я заметил, так это то, что репозиторий будет установлен, только если я использую компоновщик компонентов:

init {
    DaggerLoginViewModelComponent
        .builder()
        .build()
        .inject(this)
}

Но у меня естьПрочитайте в нескольких местах, что элемент поля будет установлен, даже если вы просто пометите конструктор класса, для которого вы хотите создать экземпляр, с помощью Inject:

class Repository @Inject constructor() {

}

Но я не обнаружил, что это правда.Даже если в конструкторе присутствует аннотация Inject, мне все равно нужно запустить конструктор.Может кто-то подтвердить, правда это или нет.

1 Ответ

0 голосов
/ 07 июня 2019

Способ работы с полевыми инъекциями осуществляется с помощью дополнительного метода для компонента Dagger, в данном случае inject(this).

Если вы посмотрите на сгенерированный Dagger код, то увидите, что тело метода inject() содержит код для выполнения внедрения элемента.

Вот как будет выглядеть сгенерированный код -

@Override
public void inject(Foo instance) {
  injectFoo(instance);
}

private injectFoo(Foo instance) {
  Foo_MembersInjector.injectRepository(instance, repositoryProvider.get());
  return instance;
}

...

public final class Foo_MembersInjector implements MemberInjector<Foo> {
  public static void injectRepository(Foo instance, Repository repository) {
    instance.repository = repository // <-- this is where the actual injection happens
  }
}

Вы правы, когда говорите, что Dagger знает, как создать объект Repository, но он не знает, что этот объект должен быть введен в отдельный класс. И это происходит только тогда, когда вы вызываете метод inject() с экземпляром определенного типа, который генерирует код для выполнения инъекции.

Надеюсь, это поможет.

...