Как использовать несколько зависимостей с 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);
}
Другие вопросы по тегам