Могут ли Dagger 2 иметь области видимости короче, чем у Activity Activity?
Я смотрел на Custom Scopes в Dagger 2 ( это и это те, в которых я пытаюсь основать свой код), и есть одна вещь, которую я до сих пор не могу понять, я вижу, что вы можете создать Компонент с настраиваемой областью действия, а затем все предоставляемые формы, содержащиеся в модулях, содержащихся в этом компоненте, будут иметь ту же область действия, что и компонент (синглтон в компоненте), либо будут иметь область действия, которая будет возвращать новые экземпляры при каждом получении.
Но я по-прежнему не понимаю, что если у вас есть область User, а затем у вас есть несколько модулей, привязанных к этой области, допустим, что к ней привязан ваш сетевой компонент, так что сетевые вызовы используют текущего пользователя информация, если вы выйдете из системы (или войдете в систему пользователя) в середине жизненного цикла Activity, изменится ли ссылка на объект, который вы в настоящий момент пометили как @Inject? или любой другой экземпляр, который вы получили, когда вызывали.inject(this) в методе Activity onCreate? Или вы должны вызвать inject еще раз, чтобы снова отобразить ссылки?
Любая помощь в этом вопросе высоко ценится:)
1 ответ
tl;dr Вы должны все управлять собой. Обновления не требуется, вам нужно воссоздать или хотя бы перезагрузить части своей деятельности.
Области предоставляют некоторую информацию о времени компиляции и помогают сделать ваш код "читабельным". Чтобы на самом деле поменять местами компоненты, это вам придется сделать самостоятельно. И да, вы должны построить свой дизайн вокруг этого, чтобы соответствующие компоненты воссоздались соответствующим образом.
Если пользователь входит / выходит, вам нужно будет создать новый UserModule
и компонент, ссылающийся на нового пользователя, предоставляющий объекты входа / выхода. Это новый компонент, на который нужно ссылаться для всех будущих компонентов в зависимости от него.
@Inject
аннотированные поля не будут обновляться автоматически, хотя вы можете просто вставить второй раз в те же поля, объекты будут просто перезаписаны.
Во второй ссылке, которую вы предоставили, они действительно реализуют своего рода обмен пользовательской информацией. Это делается путем сохранения UserComponent
в классе приложения.