Как передать data class в граф зависимостей перед созданием компонента Dagger
Что проверяют
Знаете ли вы современный способ положить в граф значение, известное только в рантайме: конфиг, id пользователя, аргументы экрана. Модуль с конструктором работает, но это старый приём. Следом спрашивают, что делать, если значение нужно одному объекту, а не всему компоненту, и как это выглядит в Hilt.
Как отвечать
@BindsInstanceв фабрике: в компоненте объявляется@Component.Factoryс методомcreate(@BindsInstance config: AppConfig): AppComponent. Экземпляр data class становится узлом графа и инжектится куда угодно внутри компонента. Модуль не нужен, вызов выглядит какDaggerAppComponent.factory().create(config);@Component.Builder: то же через билдер с методом, помеченным@BindsInstance. Фабрика предпочтительнее: пропустить обязательный параметр в ней нельзя, это ошибка компиляции;- два значения одного типа: если в граф идут две строки или два
Long, нужен квалификатор,@Namedили своя аннотация с@Qualifier; - сабкомпонент: значение живёт меньше приложения, например данные сессии. Тогда оно передаётся в фабрику сабкомпонента, граф создаётся при входе и отбрасывается при выходе;
- assisted injection: если параметр нужен одному объекту, а остальные зависимости берутся из графа, используют
@AssistedInject,@Assistedи@AssistedFactory. Объект создают через фабрику:factory.create(userId).
В Hilt компоненты создаёт фреймворк, поэтому @BindsInstance доступен только в своих компонентах через @DefineComponent. Для экрана обычно берут аргументы из SavedStateHandle во ViewModel или делают assisted injection через @HiltViewModel(assistedFactory = ...).
Где спотыкаются
Передают значение через модуль с конструктором и забывают вызвать .userModule(...) в билдере. Ошибка всплывает только в рантайме на build(), а у фабрики с @BindsInstance её ловит компилятор.
Кладут в граф изменяемый объект и ждут, что обновление увидят все. Граф отдаёт тот экземпляр, что передан при создании компонента, и подменить его потом нельзя.
Раздувают компонент приложения данными конкретного экрана. Модель одного экрана с данными из сети лучше передать через фабрику объекта или сабкомпонент.