Как использовать несколько зависимостей с Dagger 2?
Я создал NetComponent и NetModule, где я инициализирую все необходимые библиотеки для сетевого взаимодействия.
Вот код NetComponent:
@Singleton
@Component(modules={AppModule.class, NetModule.class})
public interface NetComponent {
Retrofit retrofit();
}
Я инициализировал этот NetComponent внутри класса Application.
public class App extends Application {
private NetComponent mNetComponent;
@Override
public void onCreate() {
super.onCreate();
mNetComponent = DaggerNetComponent.builder()
.appModule(new AppModule(this))
.netModule(new NetModule("mock.com"))
.build();
}
public NetComponent getNetComponent() {
return mNetComponent;
}
}
Теперь я хочу использовать SharedPreferences внутри своего приложения, поэтому я создал классы SharedPreferencesModule и Component.
@Module
public class SharedPreferenceModule {
Application mApplication;
public SharedPreferenceModule(Application mApplication) {
this.mApplication = mApplication;
}
@Provides
@Singleton
Application providesApplication() {
return mApplication;
}
@Provides
@Singleton
SharedPreferences providesSharedPreferences(Application application) {
return PreferenceManager.getDefaultSharedPreferences(application);
}
}
Вот код из SharedPreferencesComponent:
@Singleton
@Component(modules = {SharedPreferenceModule.class})
public interface SharedPreferenceComponent {
SharedPreferences getSharedPreference();
}
Я хочу использовать это внутри моего класса LoginAccountFragment. Класс LoginAccountFragment имеет свой собственный модуль и компонент.
@Module
public class LoginAccountModule {
private LoginAccountView view;
public LoginAccountModule(LoginAccountView view){
this.view = view;
}
@Provides
@FragmentScoped
LoginAccountView providesLoginAccountView(){
return view;
}
@Provides
@FragmentScoped
LoginAccountPresenter providesLoginAccountPresenter(LoginAccountPresenterImpl presenter){
return presenter;
}
}
@FragmentScoped
@Component(dependencies = {NetComponent.class}, modules = LoginAccountModule.class)
public interface LoginAccountComponent {
void inject(LoginAccountFragment fragment);
}
Как я могу добавить SharedPreferences в LoginAccountFragment?
1 ответ
Решение
@Singleton
@Component(modules={AppModule.class, NetModule.class, SharedPreferenceModule.class})
public interface ApplicationComponent {
Retrofit retrofit();
SharedPreferences sharedPreferences();
}
public class App extends Application {
private ApplicationComponent applicationComponent;
@Override
public void onCreate() {
super.onCreate();
this.applicationComponent = DaggerNetComponent.builder()
.appModule(new AppModule(this))
.netModule(new NetModule("https://mock.com"))
.build();
}
public ApplicationComponent applicationComponent() {
return applicationComponent;
}
}
@Module
public class SharedPreferenceModule {
@Provides
@Singleton
SharedPreferences providesSharedPreferences(Application application) {
return PreferenceManager.getDefaultSharedPreferences(application);
}
}
@Module
public class LoginAccountModule {
private LoginAccountView view;
public LoginAccountModule(LoginAccountView view){
this.view = view;
}
@Provides
LoginAccountView loginAccountView(){
return view;
}
@Provides
@FragmentScoped
LoginAccountPresenter loginAccountPresenter(LoginAccountPresenterImpl presenter) {
return presenter;
}
}
@FragmentScoped
@Component(dependencies = {ApplicationComponent.class}, modules = LoginAccountModule.class)
public interface LoginAccountComponent extends ApplicationComponent {
void inject(LoginAccountFragment fragment);
}