У меня есть объекты классов 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, где мне также нужно называть конкретные методы жизненного цикла. Активность также предоставляет метод для получения компонента, чтобы Фрагмент мог использовать его при построении своего собственного компонента:
// 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);
Однако, поскольку Fragment сохраняется, когда Activity уничтожается и воссоздается системой, реагирующей на изменение конфигурации (например, вращение устройства), фрагмент поддерживает ссылку на старый экземпляр A
, в то время как новый Activity правильно воссоздал новый экземпляр A
, чтобы пойти с ним. Чтобы обойти эту проблему, мне нужно создать FragmentComponent
и ввести зависимости в MyFragment.onActivityCreated
, а не MyFragment.onCreate
. С другой стороны, это означает, что зависимости F1
и F2
воссоздаются каждый раз, когда активность разрушается и воссоздается; но они являются зависимыми от фрагментации, поэтому они должны следовать жизненному циклу фрагмента, а не активности.
Таким образом, мой вопрос таков: возможно ли иметь разностные зависимости, введенные в сохраненный фрагмент? В идеале зависимости F1
и F2
должны быть введены в MyFragment.onCreate
, тогда как зависимость A
должна быть введена в MyFragment.onActivityCreated
. Я попытался использовать два разных компонента, но, похоже, не удалось выполнить частичную инъекцию. В настоящее время я закончил тем, что добавил явное переназначение зависимостей Fragment A
в MyFragment.onActivityCreated
, но это не действительно инъекция, вы знаете. Может ли это быть сделано лучше?