53

次のコードが機能しない理由を理解するのに問題があります。

私は次のプロジェクト構造を持っています:

@Component(modules = CCModule.class) 
public interface CComponent {
    XXX getXXX();
}

どこ

@Module
public class CCModule {

    @Provides @Singleton
    public XXX provide XXX(){
        return new XXX();
    }
}

@Component(dependencies = CComponent.class, modules = AAModule.class) 
public interface AComponent {
    YYY getYYY();
}

どこ

class YYY {
   @Inject
   public YYY(XXX xxx) {
       ...
   }
}

すべてを次のように初期化します。

CComponent c_component = Dagger_CComponent.builder().cCModule(new CCModule()).build();

AComponent a_component = Dagger_AComponent.builder()
        .cComponent(c_component)
        .aAModule(new AAModule())
        .build();

コンパイルが行われると、次のエラーが発生します。

エラー:(11, 1) エラー: com.test.CComponent (スコープ外) はスコープ付きバインディングを参照できない場合があります: @Provides @Singleton com.test.XXX com.test.CCModule.provideXXX()

私が目指しているのは、あるコンポーネントが他のコンポーネントからバインディングを継承して、オブジェクト (シングルトン) への同じ参照を持つようにすることです。

4

3 に答える 3

115

クラス宣言@Singletonに入れる必要があります。CComponent

@Singleton
@Component(modules = CCModule.class) 
public interface CComponent {
    XXX getXXX();
}

説明はエラー メッセージにあります:CComponentスコープ@Singleton外です。スコープです。Dagger 2 では、スコープのないコンポーネントがスコープのバインディングを持つモジュールを使用することを許可しません。
ただし、次のエラーが表示されます。

AComponent (unscoped) cannot depend on scoped components:
@Component(dependencies = CComponent.class, modules = AModule.class)

範囲指定されていないコンポーネントは、範囲指定された依存関係を持つことができません。AComponentしたがって、スコープを作成する必要があります。これを行うには、カスタムAScopeアノテーションを作成します。

@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface AScope {
}

そしてそれに注釈を付けますAComponent

@AScope
@Component(dependencies = CComponent.class, modules = AModule.class)
public interface AComponent {
}

これらは、最新のスナップショット リリースに登場した新しい要件です。これは対応する問題で議論されており、まだ変更される可能性があります。

于 2015-01-29T04:12:56.637 に答える