У меня есть ExerciseDetailFragment
, который содержит ExerciseFragmentStatePagerAdapter
, чтобы показать группу SupportUsFragmentCard
. Эти карты могут быть прокручены пользователем по горизонтали.
В моем ExerciseFragmentStatePagerAdapter
у меня есть следующий код:
fun createFragment(position: Int): Fragment {
val exercise = exercises[position]
val card = SupportUsFragmentCard()
card.setExercise(exercise) <---- this is my question/problem
return card
}
Как вы можете видеть, адаптер пейджера просто создает экземпляр SupportUsFragmentCard
, и для этого exercise
необходимо передать (карта отображает некоторую информацию об упражнении) через setExercise
.
SupportUsFragmentCard выглядит следующим образом this:
open class SupportUsFragmentCard : RootFragment() {
...
val viewModel: SupportUsViewModel by viewModels()
...
fun setExercise(exercise: Exercise?) {
viewModel.setExercise(exercise) <---- passes on the exercise to the viewModel
}
Его реализация проходит по exercise
до базового viewModel
. Что, в свою очередь, инкапсулирует это в LiveData
(на котором у SupportUsFragmentPlain
есть наблюдатели, но я не указывал этот код, поскольку это не проблема):
class SupportUsViewModel() : ViewModel() {
//interface to the view
fun getExercise(): LiveData<Exercise?> = exercise
fun setExercise(execise: Exercise?) {
exercise.value = execise. <--- updates the Livedata object
}
//underlying live data mutable values
private val exercise = MutableLiveData<Exercise?>(null)
}
Когда этот код выполняется, он падает с исключение:
IllegalStateException: Невозможно получить доступ к ViewModels из отдельного фрагмента
Я думаю, потому что createFragment
заканчивает тем, что обновляет viewModel
, фактически не находясь на экране , Я также чувствую, что такой способ работы не соответствует архитектуре MVVM.
Как правильно использовать этот сценарий, используя MVVM и LiveData для инициализации SupportUsViewModel
с Exercise
в ExerciseFragmentStatePagerAdapter
createFragment
функция?