Зачем нужны scopes в Dagger?
Что проверяют
Понимаете ли вы, что область управляет временем жизни объекта, и знаете ли, чем чревато её неверное указание.
Как отвечать
Область (@Singleton, @ActivityScoped и свои) говорит Dagger: в пределах этого компонента возвращать один и тот же экземпляр, а не создавать новый на каждое обращение.
Без области каждое внедрение даёт новый объект. Это нормально для лёгких классов, но неприемлемо для того, что должно быть общим: клиент сети с пулом соединений, база, кэш, репозиторий с состоянием.
Как это устроено: область привязана к компоненту. @Singleton живёт столько же, сколько компонент приложения; @ActivityRetainedScoped в Hilt переживает поворот экрана вместе с ViewModel; @ActivityScoped умирает вместе с активностью. То есть область это не «сколько объект живёт», а «к какому компоненту он привязан».
Правила, которые проверяет сам Dagger при сборке: компонент с областью не может зависеть от объекта с другой, более узкой областью; неправильная связь ловится как ошибка компиляции, а не в рантайме, и это его главное преимущество.
Чем чревата ошибка: положили в @Singleton объект, которому нужен контекст активности, и получили утечку экрана на всё время жизни приложения. Обратная ошибка дешевле, но тоже неприятна: репозиторий без области создаётся заново на каждом экране, и кэш внутри него не работает.
Где спотыкаются
Ставят @Singleton всему подряд «чтобы не создавалось лишнего».
Хранят в синглтоне ссылку на активность или её контекст.
Не понимают, что область привязана к компоненту, а не к времени.
Считают, что отсутствие области означает синглтон.