我正在尝试在我的活动和片段之间共享一个视图模型。我的视图模型包含一个report
,这是一个我无法序列化的复杂对象。
protected val viewModel: ReportViewModel by lazy {
val report = ...
ViewModelProviders.of(this, ReportViewModelFactory(report)).get(ReportViewModel::class.java)
}
现在我正在尝试在片段中访问视图模型,但我不想再次传递所有工厂参数。
如ViewModelProvider.get
文档所述:
返回现有视图模型或在作用域中创建新视图模型
我想访问活动中定义的 ViewModel 实例,所以我尝试了以下方法,但由于模型没有空构造函数,它在逻辑上崩溃:
protected val viewModel: ReportViewModel by lazy {
ViewModelProviders.of(requireActivity()).get(ReportViewModel::class.java)
}
应该如何在片段中访问其"工厂化"的视图模型?我们应该把工厂交给碎片吗?
谢谢!
有点晚了,但我自己也有这个问题。我发现您可以执行以下操作:
在您的活动中覆盖getDefaultViewModelProviderFactory()
如下所示:
override fun getDefaultViewModelProviderFactory(): ReportViewModelFactory {
return ReportViewModelFactory(report)
}
现在在你的片段中你可以做
requireActivity().getDefaultViewModelProviderFactory()
获得工厂。
或者简单地实例化您的视图模型,如下所示:
private val viewModel: ReportViewModel by activityViewModels()