Dagger 2 на Android: внедрить ту же зависимость в Activity и сохранить фрагмент
У меня есть объекты классовF1
а такжеF2
что я хочу добавить в сохраненный фрагмент. У меня также есть объект классаA
это зависит от действия, и я хочу, чтобы оно было внедрено в это действие и в сохраненный фрагмент, присоединенный к диспетчеру фрагментов этого действия. Я пишу следующий код. Во-первых, модуль для зависимости Activity:
@Module
public class MainActivityModule {
private Activity mActivity;
public MainActivityModule(Activity activity) {
mActivity = activity;
}
@Provides
@ActivityScope
public A provideA() {
return new A(mActivity);
}
}
Затем соответствующий компонент, который должен сделатьA
Объект доступен для его зависимых компонентов:
@ActivityScope
@Component(modules = {MainActivityModule.class})
public interface MainActivityComponent {
void inject(MainActivity activity);
// make the A object available to dependent components
A getA();
}
Я также пишу модуль, связанный с фрагментами:
@Module
public class FragmentModule {
@Provides
@FragmentScope
public F1 provideF1() {
return new F1();
}
@Provides
@FragmentScope
public F2 provideF2() {
return new F2();
}
}
и соответствующий ему компонент:
@FragmentScope
@Component(modules = {FragmentModule.class}, dependencies = {MainActivityComponent.class})
public interface FragmentComponent {
void inject(MyFragment presenter);
}
Наконец, я добавляю зависимость отA
в Деятельности, где мне также нужно вызвать определенные методы жизненного цикла для него. Activity также предоставляет метод для получения компонента, чтобы Fragment мог использовать его при создании собственного компонента:
// in MainActivity.onCreate
mActivityComponent = DaggerMainActivityComponent.builder()
.mainActivityModule(new MainActivityModule(this))
.build();
mActivityComponent.inject(this);
mA.onCreate();
и я пытаюсь ввести зависимости наA
, F1
, F2
во фрагменте тоже:
// in MyFragment.onCreate
FragmentComponent component = DaggerFragmentComponent.builder()
.fragmentModule(new FragmentModule())
.mainActivityComponent(((MainActivity) getActivity()).getComponent())
.build();
component.inject(this);
Однако, поскольку Фрагмент сохраняется, когда Операция уничтожается и воссоздается системой, реагирующей на изменение конфигурации (например, ротация устройства), Фрагмент сохраняет ссылку на старыйA
экземпляр, в то время как новый Activity правильно воссоздал новыйA
экземпляр, чтобы пойти с этим. Чтобы обойти эту проблему, я должен создатьFragmentComponent
и вводить зависимости вMyFragment.onActivityCreated
скорее, чемMyFragment.onCreate
, С другой стороны, это подразумевает, чтоF1
а такжеF2
зависимости воссоздаются каждый раз, когда действие уничтожается и воссоздается; но они являются зависимыми от фрагмента зависимостями, поэтому они должны следовать жизненному циклу фрагмента вместо действия.
Поэтому мой вопрос заключается в следующем: возможно ли вводить зависимости разной области в сохраненный фрагмент? В идеале,F1
а такжеF2
зависимости должны быть введены вMyFragment.onCreate
, в то время какA
зависимость должна быть введена вMyFragment.onActivityCreated
, Я пытался использовать два разных компонента, но, кажется, невозможно выполнить частичный впрыск. В настоящее время я добавил явное переназначение фрагмента.A
зависимость вMyFragment.onActivityCreated
но это не совсем инъекция, вы знаете. Можно ли сделать это лучше?