在不同的片段上使用相同的视图模型



我在片段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 

相关内容

  • 没有找到相关文章

最新更新