构造函数注入Dagger 2

时间:2016-03-19 23:09:39

标签: android dependency-injection dagger-2

我无法通过构造函数注入依赖项,而且我确信我做错了什么。 我有以下内容:

public class Water {
  @Inject
  public Water() {}

  @Override
  public String toString() { return "Water + ";}
}
public class Heater {
    @Inject
    public Heater() {}

    @Override
    public String toString() {return " heater";}
}

public class Aeropress {
    Water mWater;
    Heater mHeater;

    @Inject
    public Aeropress(Water water, Heater heater) {
        mWater = water;
        mHeater = heater;
    }

    @Override
    public String toString() {
        return mWater.toString() + mHeater.toString();
    }
}
public class LoginActivity extends AppCompatActivity{
   @Inject Aeropress aeropress;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      Log.e("* 69 * LoginActivity *", "onCreate " + aeropress);
}

活动中的代码打印为null,因此dagger不会注入任何内容。知道如何在不使用@provide的情况下解决这个问题吗?我错过了什么?

1 个答案:

答案 0 :(得分:1)

为了做到这一点,你必须做两件事:
1.使用inject方法声明一个组件

@Component
public interface AeropressComponent {
    void inject(LoginActivity aeropress);
}

2。在您的活动中构建匕首组件并将其注入

public class LoginActivity extends AppCompatActivity{
   @Inject Aeropress aeropress;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      DaggerAeropressComponent.builder().build().inject(this);
      /*DaggerAeropressComponent.create().inject(this);*/ //or this
      Log.e("* 69 * LoginActivity *", "onCreate " + aeropress);
}

经过这些修改后,它就像魅力一样,甚至没有创建@Module类。我理解这一点的逻辑以及你需要一个组件的原因是,为了让匕首向airopress中注入一个新实例,它需要能够找到aeropress参考的容器(活动)。此外,我只记得@Inject字段不能保密的原因是匕首在引用和创建的实例之间进行直接分配,在我的示例中它执行以下操作

LoginActivity.aeropress = Factory.createAeropress();

因此,如果不使用inject方法创建组件,它就无法知道将Factory.createAeropress();创建的实例放在何处 如果有人能给我一个更好的解决方案我会给出答案