Существует множество подробных руководств по Dagger2 в Android.Но я покажу вам, для чего он используется.И минимальное использование.
В конечном счете, кинжал будет использовать аннотацию @Inject, которая будет предоставлять (ссылку на объект или значение) на переменную.
Инъекция обычно используется на объектах многократного использования или шаблонных объектах, таких какДао, Репозиторий, ViewModel, NetworkAdapter
class SomethingThatRequiresNetwork { // Activity, Fragment
@Inject
MyReusableNetworkAdapter myReusableNetworkAdapter;
String baseUrl; // for example purpose only
SomeDependency someDependency;
void init() {
// @NOTE: DaggerMyExampleComponent is a generated class. It will be red before compilation.
MyExampleComponent MyExampleComponent = DaggerMyExampleComponent.builder().build();
MyExampleComponent.inject(this); // the actual injection happens here
}
// yes, you can just use @Inject on the variables directly but this is another use.
@Inject
void methodInjection(String baseUrl, SomeDependency someDependency) {
this.baseUrl = baseUrl;
this.someDependency = someDependency;
}
}
// ANSWER to the two questions
// this is a pseudocode of the generated code. You do not write this
// MyExampleComponent class
void inject(SomethingThatRequiresNetwork obj) {
// @NOTE: modules are actually instantiated by MyExampleComponent. Not called statically. I just shortened it
obj.myReusableNetworkAdapter = NetModule.provideNetworkAdapter();
obj.methodInjection(NetModule.provideBaseUrl(), SomeModule.provideSomeDependency());
}
// these here are modules that provide by return TYPE
// you write these
@Module
class NetModule {
@Provides
@Singleton
String provideBaseUrl() {
return "www.some-url.com";
}
@Provides
@Singleton // will store the object and reuse it.
// @NOTE: provision can work internally within modules or inter-module. the input here is provided by provideBaseUrl
MyReusableNetworkAdapter provideNetworkAdapter(String baseUrl) {
return new MyReusableNetworkAdapter(baseUrl);
}
}
@Modules
class SomeModule {
@Provides
@Singleton
SomeDependency provideSomeDependency() {
return new SomeDependency();
}
}
// Component. uses modules
@Singleton // .build() will reuse
@Component(modules = {NetModule.class, SomeModule.class})
interface MyExampleComponent {
// the method name doesn't matter
// the class type does matter though.
void inject(SomethingThatRequiresNetwork somethingThatRequiresNetwork);
// some other class that needs injection. @NOTE: I did not give example for this
void inject(SomethingThatRequiresDependency some);
}
ПРИМЕЧАНИЕ.Этот код обычно пишется снизу вверх.Вы начинаете писать «Компонент», затем «Модуль», а затем «Инъекции».
Просто следуйте указаниям в верхней части этого ответа, и вы поймете, как работает Dagger2.