2013-07-24 22 views
0

我開始使用匕首,喜歡它好看多了,但現在面臨一些困難。我的場景如下:有一個活動和一個依賴項。依賴項被注入到活動中,並需要參考該活動。就像這樣:活動圖形和非依賴發現

public class MainActivity extends BaseActivity {   
    @Inject ScbeHelper scbeHelper; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) {  
     super.onCreate(savedInstanceState); 
     ... 
    } 
} 

public class ScbeHelper { 

    protected static final String TAG = "scbe_helper"; 
    private BaseActivity activityContext; 

    @Inject 
    public ScbeHelper(BaseActivity context) {  
     this.activityContext = context; 
    } 
} 

我下面dagger's example from the github對活動的圖表。所以我在我的項目中創建了一個類似的結構。首先,BaseActivity類,從中MainActivity繼承:

public abstract class BaseActivity extends Activity { 
    private ObjectGraph activityGraph; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) {  
     super.onCreate(savedInstanceState); 

     protoApp application = (protoApp) getApplication(); 
     // Exception happens in next line, inside plus() method 
     activityGraph = application.getApplicationGraph().plus(getModules().toArray()); 

     // Inject ourselves so subclasses will have dependencies fulfilled when this method returns. 
     activityGraph.inject(this); 

     ((protoApp)getApplication()).inject(this); 
    } 

    protected List<Object> getModules() { 
     return Arrays.<Object>asList(new ActivityModule(this)); 
    } 

    public void inject(Object object) { 
     activityGraph.inject(object); 
    } 
} 

和模塊:

@Module(injects={MainActivity.class}) 
public class ActivityModule { 
    private final BaseActivity activity; 

    public ActivityModule(BaseActivity activity) { 
     this.activity = activity; 
    } 

    @Provides @Singleton BaseActivity provideActivity() { 
     return activity;   
    } 
} 

現在,問題:No injectable members on com.example.proto.BaseActivity. Do you want to add an injectable constructor? required by public com.example.proto.ScbeHelper(com.example.proto.BaseActivity)

換句話說,提供方法ActivityModule.provideActivity()沒有按「噸真的因爲某些原因提供BaseActivity實例,雖然在我的理解它的設置正確。有人在我的設置中看到錯誤嗎?我在匕首的邏輯中遺漏了什麼?

在此先感謝!

回答

2

我不是匕首專家,但是你有2個問題:

  • 你有一個循環依賴:你幫手希望有活動注射,您的活動希望有輔助注射。我不認爲匕首可以解決這個
  • 您的活動試圖讓注射兩次,一次與活動級別的圖形,一旦與應用級圖形

這裏就是我做得到它的工作:

    在ScbeHelper
  • :去掉@Inject註釋
  • 在BaseActivity:除去((protoApp)getApplication())注入(本);
  • 在ActivityModule:刪除您provideActivity方法(它不會再被使用),並添加下面的方法:
@Provides @Singleton ScbeHelper provideScbeHelper() { 
    return new ScbeHelper(activity); 
} 

這樣做是提供您ScbeHelper與它所需要的範圍內,但只留下1註解驅動注射,所以匕首可以解決它。希望這可以幫助。

+0

我忘了說我爲什麼刪除了您的活動應用程序級別的圖形:其實你的活動是不是一個入口點到AndroidModule,只能到ActivityModule,因此你不能用這個圖注它,只有活動級圖 – mrlem