Androidアプリケーションでdagger2を使用して依存関係を挿入し、daggerコンポーネントを定義しているときに、このエラーが発生します
Error:(13, 1) error: This @Singleton component cannot depend on scoped components:
@Singleton com.eaxample.app.DaggerAndroid.networkhandler.WebserviceComponent
コンポーネントの私のコードはここにあります:
@Singleton
@Component(modules = {WebserviceModule.class}, dependencies = {ApplicationComponent.class})
public interface WebserviceComponent {
WebserviceHelper providesWebserviceHelper();
}
エラーが発生しているコンポーネントのコードは次のとおりです。
@Singleton
@Component(modules = {RemoteDataModule.class}, dependencies = {WebserviceComponent.class})
public interface RemoteDataSourceComponent {
RemoteDataSource providesRemoteDataSource();
}
このエラーが発生する理由とその解決方法。
Dmitriyzaitsevの回答は、エラーが発生する理由を説明していますが、エラーを解決する方法は次のとおりです。
独自のスコープを定義します(実際にはシングルトンスコープのように動作します)。例えば。 RemoteDataScope.Java
というファイル:
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface RemoteDataScope {
}
新しいスコープを使用します。例: RemoteDataSourceComponent
の@RemoteDataScope
の代わりに@Singleton
:
@RemoteDataScope
@Component(modules = {RemoteDataModule.class}, dependencies = {WebserviceComponent.class})
public interface RemoteDataSourceComponent {
RemoteDataSource providesRemoteDataSource();
}
WebserviceComponent
とRemoteDataSourceComponent
は同じスコープを持つことはできません。ダガー2では、スコープはライフサイクルのようなものを定義し、@Singleton
が最も広いです。したがって、RemoteDataSourceComponent
がWebserviceComponent
に依存している場合、これはWebserviceComponent
が長生きする可能性があることを意味します。