我有一个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
。依次将其封装到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
的正确方法是什么?