我按如下方式注入字段成员:
@Inject
lateinit var repository: Repository
我注意到的是,只有使用组件构建器时,存储库才会设置:
init {
DaggerLoginViewModelComponent
.builder()
.build()
.inject(this)
}
但是我读过很多地方,即使您只是用Inject标记要实例化的类的构造函数,该字段成员也会被设置:
class Repository @Inject constructor() {
}
但是我还没有发现这是真的。即使在构造函数中具有Inject批注的情况下,我仍然需要运行该构造器。有人可以确认这是否正确。
答案 0 :(得分:0)
场注入的工作方式是通过对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()
方法时,这种情况才会发生,这就是它生成代码以执行注入的方式。
希望这会有所帮助。