Задать вопрос
@tiroman

Scoped компонент Dagger 2?

Всем привет. Возник вопрос с которым не могу сам разобраться. Использую в андроид приложении Dagger 2. Есть компонент со своим scope

@Module
public class DocumentModule {

    @Provides
    @DocumentScope
    public Document provideDocument(Context context, DocumentLines documentLines) {
        return new Document(context, documentLines);
    }

}

...

@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface DocumentScope {
}

...

@Component(dependencies = AppComponent.class, modules = {DocumentModule.class})
@DocumentScope
public interface DocumentComponent {

    void inject(DocumentFragment documentFragment);

}


Данный компонент создаю во фрагменте (фрагментов несколько, используется ViewPager, на каждый фрагмент нужен свой инжектированный объект документа)

@Inject
    public Document documents;

...

@Override
    public void onCreate(Bundle savedInstanceState) {
     DaggerDocumentComponent.builder().
                appComponent(appComponent).
                build().
                inject(this);
}


Проблема возникает при восстановлении состояния активити, например при повороте экрана, или восстановлении приложения из фона, в данном случае инжектированный объект documents равен null. Объясните пожалуйста как управлять жизненным циклом scoped компонента, чтобы он не обнулялся при восстановлении активити/фрагмента?

appComponent и DocumentModule здесь не привожу, они в зависимостях у данного компонента и являются синглтонами, с ними вопросов нет.

Перечитал уже кучу материалов, посмотрел исходники нескольких проектов, не укладывается в голове как управлять такими компонентами. Мне получается нужно сохранить объект компонента в private переменную и сохранять/восстанавливать его на onSaveInstanceState/onRestoreInstanceState? Мне кажется что это не так и я чего то неправильно понимаю.

Заранее благодарю.
  • Вопрос задан
  • 183 просмотра
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
@tiroman Автор вопроса
Попробовал заинжектил этот же объект в активити, в которой расположены фрагменты, в onRestoreInstanceState активити данный объект не null, хотя никаких действий по сохранению восстановлению не предпринимал, т.е. получается activity scope компонент в активити сохраняет объект в данном случае

Почитал обсуждение данной темы на реддите и so, не могу уловить суть, что то там про фрагменты пишут, но что не могу понять

upd: проверил ещё раз, при повороте экрана всё ок, объект не null, при восстановлении приложения из фона null, это если пооткрывать побольше приложений, т.е. сымитировать ситуацию когда система прибивает активити при нехватке памяти, хотя в onCreate фрагмента выполняется создание экземпляра компонента
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы