2015-01-15 5 views
0

나는 단검을 사용하고 있으며 지금까지 그 장점이 있습니다. 모든 뷰 (활동 및 단편)에 대해 하나의 모듈을 가지고 있으며이를 객체 그래프를 통해 주입하고 있습니다. 이제 맞춤보기를 포함하고 싶습니다. 내 모듈은 다음과 같습니다.Android Dagger보기 구성 요소에서 DI를 수행하는 방법

@Module(
injects = { 
    //Activity 
    MainActivity.class, 


    //Fragments 
    LookupSearchResultsFragment.class, 


    // Views 

    MainSearchComponent.class 
}, 
//includes = { 
// PersistenceModule.class 
//}, 
library = true, 
complete = false, 
addsTo = AndroidModule.class) 

내 MainSearchComponent에서 어떻게 객체 그래프를 삽입해야합니까? 현재이 작업을 수행 중입니다.

ObjectGraph.create((BaseActivity)getContext()).inject(this); 

이 오류가 발생합니다. Caused by: java.lang.IllegalStateException: Module adapter for class ...MainActivity could not be loaded. Please ensure that code generation was run for this module.

답변

1

첫째, 당신은 ObjectGraph.create()로하지 Activity 클래스를 @Module -annotated 클래스를 통과해야한다. 둘째, 당신은 inject() 뭔가가 필요할 때마다 그래프를 생성해서는 안됩니다. 일반적으로 objectGraph 필드를 Application 클래스의 필드로 지정하는 것이 일반적입니다. 즉 당신이 얻을 수있는 작업은 다음과 같습니다

@Override public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    MyApp app = (MyApp) getApplication(); 
    activityGraph = app.getObjectGraph().plus(new ActivityModule()); 
    activityGraph.inject(this); // inject with respect of activity-specific components 
} 

그리고 최대한 빨리 그것을 GC 현지 그래프에 강력한 심판을 취소하는 것을 잊지 마세요 :

@Override public void onDestroy() { 
    activityGraph = null; 
    super.onDestroy(); 
} 
당신의 ActivityonCreate()에서 다음

// Application class 
objectGraph = ObjectGraph.create(new AndroidModule()); 

+0

런타임 변수가있는 클래스를 주입하려면 어떻게해야합니까? Application 클래스에 모든 것을 주입하는 데 도움이되지 않을까요? – SoH

+0

@SoH 런타임 변수는 무엇을 의미합니까? 예를 들어 줄 수 있습니까? – colriot

+0

클래스 C는 호출 클래스 C에서받은 변수를 기반으로 다른 클래스 B를 주입하는 클래스 A를 가지고 있습니다. – SoH

0

확인 그래서 해결책을 찾았습니다. 구성 요소를 지정한 위치에 모듈을 삽입해야했습니다. 그래서 나를 위해 다음을 써야만했습니다.

ObjectGraph.create((BaseActivity)getContext()).inject(this); 

이것은 작동했습니다.

ObjectGraph.create(new AcitivityModule()).inject(this); 
관련 문제