我正在尝试 Dagger。现在我不完全明白一切是如何运作的。 所以我写了一个测试项目。
这是我的主要 Activity :
public class MainActivity extends Activity {
private ObjectGraph mActivityGraph;
@Inject Vehicle car;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mActivityGraph = ObjectGraph.create(new ActivityModule());
mActivityGraph.validate();
mActivityGraph.inject(this);
}
}
这是我的 Activity 模块:
@Module(
injects =
{
Vehicle.class,
MainActivity.class,
Wheels.class
}
)
public class ActivityModule extends Application{
@Provides Wheels provideWheels()
{
return new Wheels(4,"X12");
}
}
在我的 list 中,我添加了 ActivityModule 作为应用程序的名称。
这是我的车辆类别:
@Module(
includes = Wheels.class
)
public class Vehicle {
@Inject
Wheels wheels;
private String type;
public Vehicle(String type) {
this.type = type;
}
}
这是我的轮子:
public class Wheels {
private int inch;
private String brand;
@Inject
public Wheels(int inch, String brand) {
this.inch = inch;
this.brand = brand;
}
}
现在我想要完成的是我在 MainActivity 中有一辆汽车注入(inject)了他的轮子。现在我不知道如何在 mainActivity 中创建我的汽车,因为我想创建一辆汽车,其参数为用户填写的字符串。
我明白了:
Error:(8, 8) error: Graph validation failed: No @Module on edu.ida.daggertest.app.Wheels
Error:(20, 8) error: Unknown error java.lang.IllegalStateException thrown by javac in graph validation: Unable to create binding for edu.ida.daggertest.app.Vehicle
最佳答案
我发现了问题。这是我编辑的代码。问题在于图表之外的创建。
public class MainActivity extends Activity {
final static String TAG = MainActivity.class.getName();
private ObjectGraph mActivityGraph;
@Inject
Vehicle car;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mActivityGraph = ObjectGraph.create(new ActivityModule());
mActivityGraph.inject(this);
Log.d(TAG,String.valueOf(car.getWheels().getInch()));
Log.d(TAG,car.getWheels().getBrand());
}
}
@Module(
injects =
{
Vehicle.class,
MainActivity.class,
Wheels.class
},
complete = false
)
public class ActivityModule{
@Provides Wheels provideWheels()
{
return new Wheels(4,"X12");
}
}
public class Vehicle {
@Inject
Wheels wheels;
private String type;
public String getType() {
return type;
}
public Wheels getWheels() {
return wheels;
}
}
public class Wheels {
private int inch;
private String brand;
@Inject
public Wheels(int inch, String brand) {
this.inch = inch;
this.brand = brand;
}
public int getInch() {
return inch;
}
public String getBrand() {
return brand;
}
}
completes false 是必需的,否则 dagger 会提示可注入(inject)构造函数 Integer 和 String。
关于android - dagger 简单示例给出了 IllegalStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23216174/