Как ограничить экземпляр объекта жизненным циклом навигационного графа Jetpack Compose с помощью Hilt?Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Как ограничить экземпляр объекта жизненным циклом навигационного графа Jetpack Compose с помощью Hilt?

Сообщение Anonymous »

Предположим, у меня есть многомодульный проект Jetpack Compose с функциональными модулями, и я хочу ограничить некоторые экземпляры объектов жизненными циклами функций. Например, я хочу ограничить экземпляр AuthRepo жизненным циклом AuthFeature и удалить его из памяти сразу после входа пользователя в систему. Предположим также, что моя функция состоит из нескольких компонуемых экранов.
Итак, моя MainActivity выглядит так:

Код: Выделить всё

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
...
NavHost(navController = navController, startDestination = *AuthFeature graph*) {
navigation(*AuthFeature graph*) {
composable(*First Screen*) { backStackEntry ->
val authGraphEntry = *get authGraphEntry*
val vm = hiltViewModel(authGraphEntry)
...
}

composable(*Second Screen*) { backStackEntry ->
val authGraphEntry = *get authGraphEntry*
val vm = hiltViewModel(authGraphEntry)
...
}
}

*Other feature graph with multiple screens*

}
}
В таком случае проблем нет: AuthViewModel, которая является общей для обоих экранов, ограничена графом AuthFeature, и я могу использовать @ViewModelScoped аннотация при внедрении AuthRepo. Таким образом, AuthViewModel будет уничтожен после перехода к другой функции (с появлением в корне), и AuthRepo тоже будет уничтожен.
Появляется проблема. когда я решу создать одну ViewModel для каждого экрана. На первом и втором экранах предполагается использовать один и тот же экземпляр AuthRepo, однако аннотирование AuthRepo с помощью @ViewModelScoped приводит к созданию двух экземпляров AuthRepo, поскольку у меня есть 2 модели просмотра. . Добавление аннотации @Singleton приводит к созданию одного экземпляра для всего приложения, который не будет удален после перехода к другой функции.
Я придумал два способа. Чтобы решить эту проблему:
  • Оберните каждую функцию в действие и используйте @ActivityRetainedScoped. Однако я хочу использовать шаблон SingleActivity в своем проекте, поэтому это решение для меня не подходит.
  • Используйте Dagger и его пользовательские области действия. Но мне хотелось бы иметь более простое решение без ручной обработки жизненного цикла компонентов, чтобы сохранить чистоту кода и снизить вероятность ошибок.
С другой стороны, я не хочу оставлять по 1 ViewModel для каждой функции, потому что однажды она может вырасти до огромного количества строк кода. Есть идеи? Пожалуйста, поправьте меня, если я ошибаюсь в некоторых своих утверждениях.

Подробнее здесь: https://stackoverflow.com/questions/776 ... fecycle-us
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»