Pull to refresh

Comments 17

MainViewModelFactory умирает при пересоздании активити, а так как она не является синглтоном, даггер создает новый обьект, подтягивает зависимость на репозиторий. Репозиторий помечен при помощи @ActivityScope, поэтому он не пересоздается, по идее если фабрике тоже дать скоуп, то и фабрика не будет пересоздаваться
Я это понимаю не так.
Если пометить фабрику скоупом, то тогда она обязательно пересоздастся, потому как объекты в скоупе живут пока не умрет Activity
Правильно, но если ее пометить скоупом который лежит на уровень ниже, например если нам фабрика понадобиться на наскольких активити, то она не умрeт. Например ApplicationScope
Тогда получим конфликт, потому как нельзя внутри сабкомпонента аннотировать provide-методы более высоким скоупом
Следовательно, необходимо вынести Фабрику в AppModule и сделать ее синглтоном. И эта фабрика будет создавать все ViewModel для приложения. Я тоже столкнулся с такой проблемой, поскольку для каждого экрана делал свою фабрику, в нее включал зависимости, необходимые для ViewModel. Поэтому теперь применяю подход как в примере гугла github.com/googlesamples/android-architecture-components/blob/master/GithubBrowserSample/app/src/main/java/com/android/example/github/viewmodel/GithubViewModelFactory.java
Попробую этот вариант, спасибо за ссылку
Но почему-то мне кажется, что в таком случае фабрика не имеет доступ к модулям сабкомпонента, а значит все зависимости по этой логике будут @.Singleton

Я правильно понимаю, что при смене конфигурации пересоздаются Dagger-зависимости, но ViewModel остается прежней?

Правильным решением было бы предотвращать пересоздание Activity-компонента при смене конфигурации (как — отдельный вопрос, есть несколько способов), но с dagger-android, насколько я понял, разработчик не контролирует время жизни компонента. Тогда остается либо вносить изменения в сам dagger-android, либо отказаться от него.

А можно подробнее про «несколько способов»?
  1. Хранить компонент в retained headless fragment
  2. Сохранять компонент в saved state. Сериализация не нужна, если обернуть объект в Binder. Подробнее техника описана тут https://habrahabr.ru/post/274635/. Всё, что есть в статье не нужно, достаточно ValueBinder + BundleCompat.
Спасибо за инфу, лайкнул бы, да кармы мало
Здравствуйте,
Титульное изображение было скопировано с моего блога (https://www.techyourchance.com/dagger-2-scopes-demystified). Все права на его использование принадлежат мне, и я прошу вас немедленно его поменять и более не использовать.
С уважением,
В.Ц.
Sign up to leave a comment.

Articles