如何在FragmentStateAdapter的createFragment中初始化ViewModel?

时间:2020-05-01 14:45:35

标签: android-livedata android-architecture-components android-viewmodel android-architecture-lifecycle

我有一个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如下:

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的{​​{1}}函数中用Exercise初始化ExerciseFragmentStatePagerAdapter的正确方法是什么?

0 个答案:

没有答案