1

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

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。反过来又将其封装成一个LiveDataSupportUsFragmentPlain有观察者,但我省略了这段代码,因为它不是问题):

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:无法从分离的片段访问 ViewModel

我认为是因为createFragment最终更新了viewModel但实际上并没有出现在屏幕上。我也觉得这种工作方式不尊重 MVVM 架构。

在这种情况下,正确的方法是什么,使用 MVVM 和 LiveData在's函数中SupportUsViewModel初始化's ?ExerciseExerciseFragmentStatePagerAdaptercreateFragment

4

0 回答 0