как инициализировать ViewModel в createFragment FragmentStateAdapter? - PullRequest
0 голосов
/ 01 мая 2020

У меня есть ExerciseDetailFragment, который содержит ExerciseFragmentStatePagerAdapter, чтобы показать группу SupportUsFragmentCard. Эти карты могут быть прокручены пользователем по горизонтали.

enter image description here

В моем 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 функция?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...