Zależności składników - użyj tej opcji, jeśli chcesz zachować niezależność dwóch składników.
Podkomponenty - użyj tej opcji, jeśli chcesz zachować połączone dwa komponenty.
Poniższy przykład posłuży do wyjaśnienia zależności składników i składników podrzędnych . W tym przykładzie warto zwrócić uwagę na:
SomeClassA1
można tworzyć bez żadnych zależności. ModuleA
zapewnia i wystąpienie za SomeClassA1
pośrednictwem provideSomeClassA1()
metody.
SomeClassB1
nie można stworzyć bez SomeClassA1
. ModuleB
może dostarczyć wystąpienie SomeClassB1
tylko wtedy, gdy wystąpienie SomeClassA1
jest przekazane jako argument do provideSomeClassB1()
metody.
@Module
public class ModuleA {
@Provides
public SomeClassA1 provideSomeClassA1() {
return new SomeClassA1();
}
}
@Module
public class ModuleB {
@Provides
public SomeClassB1 provideSomeClassB1(SomeClassA1 someClassA1) {
return new SomeClassB1(someClassA1);
}
}
public class SomeClassA1 {
public SomeClassA1() {}
}
public class SomeClassB1 {
private SomeClassA1 someClassA1;
public SomeClassB1(SomeClassA1 someClassA1) {
this.someClassA1 = someClassA1;
}
}
Dagger zajmie się przekazaniem instancji SomeClassA1
jako argumentu do provideSomeClassB1()
metody przy ModuleB
każdej ModuleB
inicjalizacji deklaracji komponentu / komponentu podrzędnego . Musimy poinstruować Daggera, jak wypełnić tę zależność. Można to zrobić za pomocą zależności składnika lub składnika podrzędnego .
Zależność komponentów
Zwróć uwagę na następujące punkty w przykładzie zależności składnika poniżej:
ComponentB
musi zdefiniować zależność za pomocą dependencies
metody na @Component
adnotacji.
ComponentA
nie trzeba deklarować ModuleB
. Dzięki temu oba komponenty są niezależne.
public class ComponentDependency {
@Component(modules = ModuleA.class)
public interface ComponentA {
SomeClassA1 someClassA1();
}
@Component(modules = ModuleB.class, dependencies = ComponentA.class)
public interface ComponentB {
SomeClassB1 someClassB1();
}
public static void main(String[] args) {
ModuleA moduleA = new ModuleA();
ComponentA componentA = DaggerComponentDependency_ComponentA.builder()
.moduleA(moduleA)
.build();
ModuleB moduleB = new ModuleB();
ComponentB componentB = DaggerComponentDependency_ComponentB.builder()
.moduleB(moduleB)
.componentA(componentA)
.build();
}
}
SubComponent
Zwróć uwagę na następujące punkty w przykładzie SubComponent:
- Ponieważ
ComponentB
nie zdefiniował zależności od ModuleA
, nie może żyć samodzielnie. Zależy to od składnika, który zapewni ModuleA
. Stąd ma @Subcomponent
adnotację.
ComponentA
zadeklarował ModuleB
za pomocą metody interfejsu componentB()
. To sprawia, że dwa komponenty są połączone. W rzeczywistości ComponentB
można go zainicjować tylko za pośrednictwem ComponentA
.
public class SubComponent {
@Component(modules = ModuleA.class)
public interface ComponentA {
ComponentB componentB(ModuleB moduleB);
}
@Subcomponent(modules = ModuleB.class)
public interface ComponentB {
SomeClassB1 someClassB1();
}
public static void main(String[] args) {
ModuleA moduleA = new ModuleA();
ComponentA componentA = DaggerSubComponent_ComponentA.builder()
.moduleA(moduleA)
.build();
ModuleB moduleB = new ModuleB();
ComponentB componentB = componentA.componentB(moduleB);
}
}
SomeClassB1
zależy odSomeClassA1
.ComponentA
musi jawnie zdefiniować zależność”. ==> czy miałeś na myśli "ComponentB
musi jawnie zdefiniować zależność"?SomeClassB1
jest zależne odSomeClassA1
.ComponentA
Nie trzeba wyraźnie definiować zależności”. miałeś na myśli „ComponentB
nie trzeba jawnie definiować zależności”.Zgodnie z dokumentacją :
Component Dependency
daje ci dostęp tylko do powiązań uwidocznionych jako metody aprowizacji poprzez zależności komponentów, tj. masz dostęp tylko do typów zadeklarowanych jako nadrzędneComponent
.SubComponent
daje ci dostęp do całego grafu wiązania od jego rodzica, kiedy jest zadeklarowany, tzn. masz dostęp do wszystkich obiektów zadeklarowanych w jegoModule
s.Powiedzmy Powiedzmy, masz
ApplicationComponent
zawierający wszystkieAndroid
rzeczy związane (LocationService
,Resources
,SharedPreference
, etc). Chcesz również mieć miejsce, wDataComponent
którym zarządzasz rzeczami w celu trwałości, a także zajmujeszWebService
się interfejsami API. Jedyne, czego ci brakuje,DataComponent
to to,Application Context
co znajduje się wApplicationComponent
. Najprostszym sposobem na uzyskanieContext
fromDataComponent
byłaby zależność odApplicationComponent
. Musisz być pewien, że maszContext
wyraźnie zadeklarowane w,ApplicationComponent
ponieważ masz dostęp tylko do zadeklarowanych rzeczy. W tym przypadku nie ma pracy ręcznej, co oznacza, że nie musisz określaćSubmodules
w nadrzędnymComponent
i jawnie dodawać swojego modułu podrzędnego do modułu nadrzędnego, takiego jak:Teraz uważają, że przypadek, w którym chcesz, aby wprowadzić
WebService
odDataComponent
iLocationService
odApplicationComponent
do twoichFragment
który wiąże się z wykorzystaniem@Submodule
plus
funkcji powyżej. Fajną rzeczą jest to, że komponent, z którym się łączysz (ApplicationComponent
) nie musi ujawniaćWebService
aniLocationService
dlatego, że masz od razu dostęp do całego wykresu.źródło
@Submodule
. Czy to literówka?classes
przykładów i więcej ilustracji, aby zilustrować dokładny punkt.Oto przykład kodu ze zrzutem ekranu, aby lepiej zrozumieć składnik i składnik podrzędny:
Składnik:
Podkomponent:
I diagram obrazkowy:
Źródło: link
źródło
Jeszcze jedna rzecz, o której do tej pory nie zdawałem sobie sprawy, to:
@Subcomponent
Instancja ma dokładnie jeden element nadrzędny (choć różne składniki mogą instancji tego samego@Subcomponent
i być rodzicem tej instancji)@Component
może mieć zero, jeden lub wiele komponentów „nadrzędnych” zadeklarowanych poprzez zależności komponentówźródło