我有一个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:无法从分离的片段访问 ViewModel
我认为是因为createFragment
最终更新了viewModel
但实际上并没有出现在屏幕上。我也觉得这种工作方式不尊重 MVVM 架构。
在这种情况下,正确的方法是什么,使用 MVVM 和 LiveData在's函数中SupportUsViewModel
初始化's ?Exercise
ExerciseFragmentStatePagerAdapter
createFragment