Способ работы с полевыми инъекциями осуществляется с помощью дополнительного метода для компонента 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()
с экземпляром определенного типа, который генерирует код для выполнения инъекции.
Надеюсь, это поможет.