我在片段A上有viewModel,我以这种方式加载它:
viewModel = ViewModelProvider(this, viewModelFactory).get(AFragmentVM::class.java)
然后从片段A转到片段B。这可能在片段B上使用相同的视图模型吗?在片段B中,我尝试过(就像在文档中一样(:
private val viewModel: AFragmentVM by activityViewModels()
但是我在尝试使用这个ViewModel时遇到了一个异常:
java.lang.RuntimeException: Cannot create an instance of class ...AFragmentVM
...
BFragment.getViewModel(Unknown Source:2)
BFragment.onCreateView(ChartFragment.kt:40)
...
Caused by: java.lang.NoSuchMethodException: ...AFragmentVM.<init> [class android.app.Application]
编辑:
根据@SebastienRieu和@IntelliJ Amiya的回答,我所要做的一切都是以这种方式在片段A上创建ViewModel:
viewModel = ViewModelProvider(requireActivity(), viewModelFactory).get(AFragmentVM::class.java)
或者:
viewModel = ViewModelProvider(let {activity}!!,viewModelFactory).get(AFragmentVM::class.java)
然后在片段B上,我可以使用:
private val viewModel: AFragmentVM by activityViewModels()
如果这两个片段在同一个活动中,您应该替换它:
viewModel = ViewModelProvider(this, viewModelFactory).get(AFragmentVM::class.java)
通过这个
viewModel = ViewModelProvider(requireActivity(), viewModelFactory).get(AFragmentVM::class.java)
并在活动中添加一个viewModel,并在该活动中初始化它,如下所示:
viewModel = ViewModelProvider(this, viewModelFactory).get(AFragmentVM::class.java)
使用requireActivity((在片段中设置VM时,您会告诉片段使用活动共享ViewModel
片段A
viewModel = ViewModelProvider(let {activity}!!,viewModelFactory).get(AFragmentVM::class.java)
片段B
private lateinit var viewModel: AFragmentVM