构造函数注入 Dagger 2

Constructor 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);
}

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

为此你必须做两件事:
1.用inject方法声明一个组件

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

2。在你的 activity 中构建 dagger 组件并注入它

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 class 就可以正常工作。我理解这一点的逻辑以及您需要一个组件的原因是,为了让匕首将新实例注入 aeropress,它需要容器(activity),其中可以找到 aeropress 的引用。我现在还记得 @Inject 字段不能私有的原因是 dagger 在引用和创建的实例之间进行直接分配,在我的示例中它执行以下操作

LoginActivity.aeropress = Factory.createAeropress();

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