2014-04-22 38 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是不是一個模塊