좋아, 프레임 워크를 혼합하는 데 문제가 있습니다. 그래서 Android Annotations에서 공유 환경 설정 관리자를 생성해야하는 @SharedPref
주석이있는 클래스가 있습니다. 나는 그것의 사용을 만들기 위해 조각으로 생성 된 클래스 (DownloadPrefs_
될 것이다) 주입하고 싶습니다 지금대거 Android Annotations 클래스를 삽입하지 않음
@SharedPref(value= SharedPref.Scope.UNIQUE)
public interface DownloadPrefs {
@DefaultBoolean(false)
boolean hasEnabledDownload();
@DefaultBoolean(false)
boolean showedDownloadDialog();
@DefaultLong(0)
long downloadRefreshedOn();
}
: 클래스는이 같은 비트 무언가를 보인다. 그것을
@Inject DownloadPrefs_ downloadPrefs;
을 이제 실제 DownloadPrefs_
클래스가 실행시에 생성되기 때문에 : 조각은 새로운 모듈을 추가하기 전에 주입 작업을했다, 그래서 나는 단지 내가 추가 한 것을 여기에 쓸거야 생성자를 삽입 된 것으로 표시 할 수 없으므로 @Provides
주석을 만드는 것이 가장 합당합니다. DownloadPrefs_
에는 인수가없는 생성자도 없습니다. 그때 사용하고이 모듈은 새로운 @Provides
수신 :
@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);
}
대거와 함께 Github 문제 [# 410] (https://github.com/square/dagger/issues/410)를 만들었으니 이후 모든 논의가있을 것입니다. –
나는 보통 프로 가드 (proguard)를 비난 할 것입니다. 특히 물건을 죽이지는 않았는지 확인하십시오.하지만 프로 가드가 없을 때 이런 일이 발생한다고 말하면 혼란 스럽습니다. DownloaderModule의'@ Provides' 라인이 컴파일됩니까? 그렇다면, 경비원은 그것을 벗겨 내지 마십시오. 그래프를 구성하는 주 모듈에 DownloaderModule을 포함하고 있습니까? 메인 모듈의 껍질, 그래프를 만드는 선,'@ Module' 주석에 설정 한 속성을 추가 할 수 있습니까? 모든 것이 잘 연결되는지 확인하는 것이 중요합니다. –
이 프로젝트는 AndroidAnnotation을 사용하며 생성 된 클래스 인 DownloadPrefs_에는 내부에 선언이 없습니다. – Mikooos