Android: Переопределить объект viewmodel в дочернем фрагменте с помощью Koin?

#java #android #kotlin #mvvm #koin

Вопрос:

У меня здесь следующий случай, у меня есть 2 фрагмента:

 LoginFragment : BaseAuthFragment
RegFragment : BaseAuthFragment
 

и соответствующие модели просмотра:

 LoginViewModel : BaseAuthViewModel
RegViewModel : BaseAuthViewModel
 

У LoginFragment есть объект LoginViewModel
У фрагмента есть объект RegViewModel
У BaseAuthFragment есть объект BaseAuthViewModel

Я использую Koin для внедрения зависимостей, чтобы объявление объекта ViewModel в BaseAuthFragment было примерно таким:

 private val viewModel: BaseAuthViewModel by viewModel()
 

BaseAuthViewModel сохраняет общие наблюдаемые объекты livedata для фрагментов входа и регистрации, таких как загрузка, ошибка и т. Д..

Чего я пытаюсь добиться, так это того, что я хочу наблюдать за этими общими объектами Livedata из BaseAuthViewModel внутри BaseAuthFragment, чтобы мне не приходилось копировать код в LoginFragment amp;amp; RegFragment отдельно.

Но внутри LoginFragment amp;amp; RegFragment у меня уже должны быть LoginViewModel и RegViewModel, которые являются дочерними элементами BaseAuthViewModel, так можно ли как-то переопределить тип объекта ViewModel в дочерних фрагментах ?

Ответ №1:

Вы можете определить что-то вроде этого:

Базовый класс

 abstract class BaseFragment : Fragment() {
    /**
     * Every fragment has to have an instance of a view model that extends from the BaseViewModel
     */
    abstract val _viewModel: BaseViewModel

    ...
}
 

детский класс

 class ChildFragment : BaseFragment() {
    override val _viewModel: ChildViewModel by inject()
...
}