Инжекция поля в dagger
немного сложнее, чем инжекция в конструктор.Когда вы используете инъекцию в конструктор вот так
class A {
@Inject
public A(B b) {}
}
и у вас есть провайдер для класса B
@Module
class DaggerModule {
@Provides
B provideB() {}
}
, теперь кинжал будет знать, как создать экземпляр A
и передать ему требуемый параметр конструктора,Так что все в порядке, успешно компилируется и работает отлично.
Но если мы говорим о внедрении поля
class A {
@Inject
B b;
}
и у нас есть провайдер где-то для B
, кинжал не может знать, как создатьA
экземпляр и свойство Inject b
при создании вручную экземпляра A
вручную.Чтобы это работало, вам нужно написать специальный метод в компоненте
@Component(DaggetModule.class)
interface DaggerComponent {
void inject(A a);
}
и где-нибудь в коде
A a = new A();
DaggerComponent component = //TODO getDaggerComponent()
component.inject(a);
После этого свойство b
будет инициализировано и доступно для дальнейшего использования.Надеюсь, теперь понятно, как заставить работать полевую инъекцию.