Спасибо, это мне очень помогло!
лицитDagger 2
в моем приложении для Android. У меня это настроено следующим образом:
AppComponent.java
@Singleton
@Component(modules = {
AndroidInjectionModule.class,
AndroidSupportInjectionModule.class,
ActivityBuilder.class,
AppModule.class,
DataBaseDaoModule.class
})
public interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
Builder application(Application aApplication);
AppComponent build();
}
Application application();
void inject(MyApplication aApplication);
}
AppInjector.java
ublic class AppInjector {
public static void init(MyApplication aApplication) {
//Initialize dagger and inject the aApplication
DaggerAppComponent.builder().application(aApplication).build().inject(aApplication);
aApplication.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity aActivity, Bundle aBundle) {
handleActivity(aActivity);
}
@Override
public void onActivityStarted(Activity aActivity) {
}
@Override
public void onActivityResumed(Activity aActivity) {
}
@Override
public void onActivityPaused(Activity aActivity) {
}
@Override
public void onActivityStopped(Activity aActivity) {
}
@Override
public void onActivitySaveInstanceState(Activity aActivity, Bundle aBundle) {
}
@Override
public void onActivityDestroyed(Activity aActivity) {
}
});
}
private static void handleActivity(Activity aActivity) {
if (aActivity instanceof HasActivityInjector) {
AndroidInjection.inject(aActivity);
Timber.d("injected Activity");
}
if (aActivity instanceof FragmentActivity) {
((FragmentActivity) aActivity).getSupportFragmentManager()
.registerFragmentLifecycleCallbacks(
new FragmentManager.FragmentLifecycleCallbacks() {
@Override
public void onFragmentCreated(FragmentManager fm, Fragment f,
Bundle savedInstanceState) {
if (f instanceof Injectable) {
Timber.d("injected Fragment");
AndroidSupportInjection.inject(f);
}
}
}, true);
}
}
}
AppModule.java
Module(includes = ViewModelModule.class)
class AppModule {
@Singleton
@Provides
ApiService providesApiService(OkHttpClient aClient, MyInterceptor aInterceptor) {
//Build a Retrofit object here
}
@Singleton
@Provides
OkHttpClient providesOkHTTPClient(MyInterceptor aInterceptor) {
//Setup OKHTTP here
}
}
И, наконец, вMyApplication.Java вonCreate
метод, который я просто называюAppInjector
вот так:AppInjector.init(this);
Все это работает и все, что я положил в модулях моего AppComponent, я могу ввести вActivities, Fragments and ViewModels
.
Тем не менее, у меня есть случаи, когда мне понадобитсяutility
класс, который зависит отApplication
, заcontex
- и я использую служебный класс в разных местах. Или у меня будетManager
класс, который зависит от приложения, или нуждается в чем-то из AppModule. Тем не менее, так как я использую эти классы внеActivities, Fragments and ViewModels
Я не могу просто ввести. Как бы я предоставил мойutility
классы с их зависимостями и любой другой тип класса - как класс менеджера?
Моей первой мыслью было создатьUtilityComponent
иManagerCompoent
своего рода, однако я понятия не имею, как заставить их работать с чем-либо вAppModuel
или через мойAppComponent
.