web-dev-qa-db-ja.com

シングルトンコンポーネントはスコープコンポーネントに依存できません

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();
}

このエラーが発生する理由とその解決方法。

14
Sushant Kumar

Dmitriyzaitsevの回答は、エラーが発生する理由を説明していますが、エラーを解決する方法は次のとおりです。

  1. 独自のスコープを定義します(実際にはシングルトンスコープのように動作します)。例えば。 RemoteDataScope.Javaというファイル:

    @Scope
    @Retention(RetentionPolicy.RUNTIME)
    public @interface RemoteDataScope {
    }
    
  2. 新しいスコープを使用します。例: RemoteDataSourceComponent@RemoteDataScopeの代わりに@Singleton

    @RemoteDataScope
    @Component(modules = {RemoteDataModule.class}, dependencies = {WebserviceComponent.class})
    public interface RemoteDataSourceComponent {
           RemoteDataSource providesRemoteDataSource();
    }
    
13
RumburaK

WebserviceComponentRemoteDataSourceComponentは同じスコープを持つことはできません。ダガー2では、スコープはライフサイクルのようなものを定義し、@Singletonが最も広いです。したがって、RemoteDataSourceComponentWebserviceComponentに依存している場合、これはWebserviceComponentが長生きする可能性があることを意味します。

12
dmitriyzaitsev