Комментарии 17
MainViewModelFactory
умирает при пересоздании активити, а так как она не является синглтоном, даггер создает новый обьект, подтягивает зависимость на репозиторий. Репозиторий помечен при помощи @ActivityScope
, поэтому он не пересоздается, по идее если фабрике тоже дать скоуп, то и фабрика не будет пересоздаватьсяЯ это понимаю не так.
Если пометить фабрику скоупом, то тогда она обязательно пересоздастся, потому как объекты в скоупе живут пока не умрет Activity
Если пометить фабрику скоупом, то тогда она обязательно пересоздастся, потому как объекты в скоупе живут пока не умрет Activity
Тогда получим конфликт, потому как нельзя внутри сабкомпонента аннотировать 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
Но почему-то мне кажется, что в таком случае фабрика не имеет доступ к модулям сабкомпонента, а значит все зависимости по этой логике будут @.Singleton
Тоже у себя использую пример Google, но на Kotlin.
gist.github.com/LogosIntellect/f786c218bea72cbfee69099d3d163ea2
gist.github.com/LogosIntellect/f786c218bea72cbfee69099d3d163ea2
Я правильно понимаю, что при смене конфигурации пересоздаются Dagger-зависимости, но ViewModel остается прежней?
Правильно
Правильным решением было бы предотвращать пересоздание Activity-компонента при смене конфигурации (как — отдельный вопрос, есть несколько способов), но с dagger-android, насколько я понял, разработчик не контролирует время жизни компонента. Тогда остается либо вносить изменения в сам dagger-android, либо отказаться от него.
А можно подробнее про «несколько способов»?
- Хранить компонент в retained headless fragment
- Сохранять компонент в saved state. Сериализация не нужна, если обернуть объект в Binder. Подробнее техника описана тут https://habrahabr.ru/post/274635/. Всё, что есть в статье не нужно, достаточно
ValueBinder
+BundleCompat
.
Здравствуйте,
Титульное изображение было скопировано с моего блога (https://www.techyourchance.com/dagger-2-scopes-demystified). Все права на его использование принадлежат мне, и я прошу вас немедленно его поменять и более не использовать.
С уважением,
В.Ц.
Титульное изображение было скопировано с моего блога (https://www.techyourchance.com/dagger-2-scopes-demystified). Все права на его использование принадлежат мне, и я прошу вас немедленно его поменять и более не использовать.
С уважением,
В.Ц.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
«Dagger-Android & AAC» или «впихнуть невпихиваемое»