1

좋아, 프레임 워크를 혼합하는 데 문제가 있습니다. 그래서 Android Annotations에서 공유 환경 설정 관리자를 생성해야하는 @SharedPref 주석이있는 클래스가 있습니다. 나는 그것의 사용을 만들기 위해 조각으로 생성 된 클래스 (DownloadPrefs_ 될 것이다) 주입하고 싶습니다 지금대거 Android Annotations 클래스를 삽입하지 않음

DownloadPrefs.java

@SharedPref(value= SharedPref.Scope.UNIQUE) 
public interface DownloadPrefs { 

    @DefaultBoolean(false) 
    boolean hasEnabledDownload(); 

    @DefaultBoolean(false) 
    boolean showedDownloadDialog(); 

    @DefaultLong(0) 
    long downloadRefreshedOn(); 
} 

: 클래스는이 같은 비트 무언가를 보인다. 그것을

Fragment.java

@Inject DownloadPrefs_ downloadPrefs; 

을 이제 실제 DownloadPrefs_ 클래스가 실행시에 생성되기 때문에 : 조각은 새로운 모듈을 추가하기 전에 주입 작업을했다, 그래서 나는 단지 내가 추가 한 것을 여기에 쓸거야 생성자를 삽입 된 것으로 표시 할 수 없으므로 @Provides 주석을 만드는 것이 가장 합당합니다. DownloadPrefs_에는 인수가없는 생성자도 없습니다. 그때 사용하고이 모듈은 새로운 @Provides 수신 :

DownloaderModule.java

@Provides //@Singleton // Does not work with/out @Singleton 
DownloadPrefs_ provideDownloadPrefs() { 
    return new DownloadPrefs_(MinimalBible.getApplication()); 
} 

그것에 대해 기술하기 위해, 안드로이드 주석에 의해 생성 된 가져옵니다 DownloadPrefs_ 생성자에 전달 컨텍스트를 기대하고, 내가 짐작했을 것이다 응용 컨텍스트가 적합 할 것입니다. 그렇지 않으면 어떻게하면 Activity 컨텍스트에 액세스 할 수 있는지 잘 모르겠습니다. 또는 그것이 실제로 ObjectGraph을 깨뜨릴 지 여부.

그러나, 나는 실제 주사를 실행에 갈 때, 나는 다음과 같은 메시지가 :

Caused by: java.lang.IllegalStateException: Errors creating object graph: 
    org.bspeice.minimalbible.activities.downloader.DownloadPrefs_ has no injectable members. Do you want to add an injectable constructor? required by class org.bspeice.minimalbible.activities.downloader.BookListFragment 

무슨 일이 일어나고 있는지에 대한 어떤 단서? 그것은 내 사건에 대한 답변을 다른 사람의 질문에 "주사 할 수없는 회원"에 대해 묻는 질문처럼 보이지 않습니다. 위의 코드를 추가하기 전에 작동하는 앱이있었습니다.

업데이트 : 일부 중복 확인을 한 후에 다음과 같은 이상한 동작이 나타났습니다. 미리 빌드 된 Android Annotations 클래스를 복사하고 이름을 바꾸어 삽입하면 모든 것이 작동합니다. 또한 원래 빌드 된 Android Annotations 클래스 (DownloadPrefs_.java)가 .dex에 실제로 있는지 확인할 수 있으므로 단검에서는 찾을 수없는 이유가 없어야합니다. 모든 것이 디버그 빌드를하고 있기 때문에 ProGuard가 어떤 것을 망쳐 놓고 있다고 상상할 수 없습니다.

이 시점에서 나는 오류를 보여주기 위해 최소한의 프로젝트를 만들고 Dagger에 문제를 제기 할 것입니다. 그 동안 내가 정리할 때까지 Prefs 클래스를 다시 작성해야합니다.

MinimalBibleModules.java

@Module(
    injects = { 
     MinimalBible.class 
    }, 
    includes = { 
     ActivityModules.class 
    } 
) 
public class MinimalBibleModules { 
} 

ActivityModules : 여기 2014년 5월 12일

UPDATE 사출를 담당하는 모듈이다.자바

@Module(
    includes = { 
     ActivityDownloaderModule.class 
    } 
) 
public class ActivityModules { 
} 

ActivityDownloaderModule.java 또한

@Module(
     injects = { 
      BookListFragment.class, 
      DownloadManager.class, 
      BookRefreshTask.class 
     } 
) 
public class ActivityDownloaderModule { 

    @Provides @Singleton 
    DownloadManager provideDownloadManager() { 
     return new DownloadManager(); 
    } 

    @Provides 
    EventBus provideBus() { 
     return new EventBus(); 
    } 


    @Provides //@Singleton 
    DownloadPrefs_ provideDownloadPrefs() { 
     return new DownloadPrefs_(MinimalBible.getApplication()); 
    } 
} 

그래프가 작성되는 방법

MinimalBible.java

public class MinimalBible extends Application { 

    private ObjectGraph graph; 

    private static MinimalBible instance; 

    public MinimalBible() { 
     instance = this;   
    } 

    @Override 
    public void onCreate() { 
     graph = ObjectGraph.create(new MinimalBibleModules()); 
     graph.inject(this); 
    } 
+0

대거와 함께 Github 문제 [# 410] (https://github.com/square/dagger/issues/410)를 만들었으니 이후 모든 논의가있을 것입니다. –

+0

나는 보통 프로 가드 (proguard)를 비난 할 것입니다. 특히 물건을 죽이지는 않았는지 확인하십시오.하지만 프로 가드가 없을 때 이런 일이 발생한다고 말하면 혼란 스럽습니다. DownloaderModule의'@ Provides' 라인이 컴파일됩니까? 그렇다면, 경비원은 그것을 벗겨 내지 마십시오. 그래프를 구성하는 주 모듈에 DownloaderModule을 포함하고 있습니까? 메인 모듈의 껍질, 그래프를 만드는 선,'@ Module' 주석에 설정 한 속성을 추가 할 수 있습니까? 모든 것이 잘 연결되는지 확인하는 것이 중요합니다. –

+0

이 프로젝트는 AndroidAnnotation을 사용하며 생성 된 클래스 인 DownloadPrefs_에는 내부에 선언이 없습니다. – Mikooos

답변

1

을 여기 두 부분이 있습니다. 먼저 컨텍스트에 액세스하는 방법. 당신은 정적 인 일을 할 수 있지만 그래도 바람직하지 않습니다. 일반적으로,이 같은 상황, 운반 상태 모듈과 그래프를 구성해야합니다 : 응용 프로그램이 다음 시드됩니다

Application appInstance = ...; 
ObjectGraph appGraph = ObjectGraph.create(
    MyAppModule.class, 
    new ApplicationModule(appInstance)); 

:

@Module 
class ApplicationModule { 
    private final Application application; 

    public ApplicationModule(Application app) { 
    this.application = app; 
    } 

    // you can mark this singleton, but it's minor overhead 
    // and the fact that you have a single instance stored 
    // means it's semantically equivalent. But for clarity 
    // it's sometimes good to make the point. 
    @Provides 
    @Singleton 
    Application application() { 
    return application; 
    } 

    // optionally: bind it as a Context with a qualifier. 
    // note: never bind Context without a qualifier annotation 
    // as Activity and Application are both Context subtypes. 
    @Provides 
    @Singleton 
    @PerApplication 
    Context appContext(Application app) { 

    // Doing this instead of returning this.application is 
    // semantically equivalent but links @PerApplication Context 
    // to Application, so in graph analysis and error reporting 
    // the link is clearer. That's a personal choice. 
    return app; 
    } 
} 

여하튼를, 당신은 다음 그래프를 만들 때 의존성으로 선언하는 다른 유형에 의존 할 수 있습니다.

관련 문제