2015-01-27 15 views
36

Mam problem ze zrozumieniem, dlaczego poniższy kod nie działa.Problemy dotyczące pojedynczych jednostek podczas korzystania z zależności składników

Mam następujące struktury projektu:

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

gdzie

@Module 
public class CCModule { 

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

i

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

gdzie

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

zainicjować wszystko jak:

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

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

Po kompilacja odbywa się następujący błąd:

Error:(11, 1) error: com.test.CComponent (unscoped) may not reference scoped bindings: @Provides @Singleton com.test.XXX com.test.CCModule.provideXXX()

Co mam dążenie do jest mieć jeden składnik dziedziczyć powiązania z innymi składnikami, aby mieć te same odniesienia do obiektów (pojedynczych).

Odpowiedz

81

Należy umieścić deklarację klasy @Singleton do CComponent.

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

Wyjaśnienie jest w błędzie: CComponent jest unscoped, @Singleton jest zakres. Dagger 2 nie zezwala na to, aby nieskopowe komponenty używały modułów z wiązaniami o określonym zakresie.
Jednak teraz otrzymasz następujący błąd:

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

Unscoped elementy nie mogą mieć scoped zależności. Musisz więc ustalić zakres AComponent. Aby to zrobić, utwórz niestandardową adnotację AScope.

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

i opisywanie z nim AComponent:

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

Są to nowe wymagania ukazał się w najnowszym snapshot release. Zostało to omówione w odpowiedniej wersji issue i nadal można je zmienić.

+0

@ AlexanderVasiljev Testowany na najnowszej migawce. Działa dobrze =). Zaktualizowałem moją odpowiedź nieco za pomocą niestandardowej adnotacji "AScope". Coś jest nie tak z twoim kodem. Pokaż to. Przy okazji, porozmawiajmy po angielsku, to nie jest rosyjski zasób. –

+0

czyste rozwiązanie Sir –

0

Dodaj

@Singleton 
@Component(modules = {NameModule.class}) 
public interface NameComponent { 

} 

dla komponentu ponieważ dagger2 nie pozwalają używać unscoped komponenty z lunetą modułów

Powiązane problemy