2014-04-22 34 views
2

我正在试验Dagger。现在我不完全明白一切是如何运作的。 所以我写了一个测试项目。匕首简单的例子给出IllegalStateException

这是我的MainActivity:

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

这是我ActivityModule:

@Module(
     injects = 
       { 
         Vehicle.class, 
         MainActivity.class, 
         Wheels.class 
       } 
) 
public class ActivityModule extends Application{ 

    @Provides Wheels provideWheels() 
    { 
     return new Wheels(4,"X12"); 
    } 
} 

在我的清单我增加了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是注入其轮汽车。现在我不知道如何创建我的车在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 

回答

1

我发现问题。这是我编辑的代码。问题是从图上创建。

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

完成false是必需的,否则匕首将抱怨可注射构造函数Integer和String。

1
@Module(
     includes = Wheels.class 
) 
public class Vehicle { 

其实这引起了你的编译时错误,因为Wheels是不是一个模块