构造函数注入 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();
创建的实例放在哪里
如果有人能给我更好的解决方案我会标记答案
我无法通过构造函数注入依赖项,我确定我做错了什么。 我有以下内容:
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();
创建的实例放在哪里
如果有人能给我更好的解决方案我会标记答案