可以仅用构造函数完成Dagger注入字段成员的操作

时间:2019-05-30 06:59:46

标签: android dagger-2

我按如下方式注入字段成员:

@Inject
lateinit var repository: Repository

我注意到的是,只有使用组件构建器时,存储库才会设置:

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

但是我读过很多地方,即使您只是用Inject标记要实例化的类的构造函数,该字段成员也会被设置:

class Repository @Inject constructor() {

}

但是我还没有发现这是真的。即使在构造函数中具有Inject批注的情况下,我仍然需要运行该构造器。有人可以确认这是否正确。

1 个答案:

答案 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()方法时,这种情况才会发生,这就是它生成代码以执行注入的方式。

希望这会有所帮助。