在片段内使用ViewModelFactory

时间:2019-10-04 09:40:56

标签: android kotlin fragment viewmodel

我正在尝试在我的活动和片段之间共享一个ViewModel。我的ViewModel包含一个report,这是我无法序列化的复杂对象。

    protected val viewModel: ReportViewModel by lazy {
        val report = ...
        ViewModelProviders.of(this, ReportViewModelFactory(report)).get(ReportViewModel::class.java)
    }

现在,我正在尝试访问片段中的viewmodel,但是我不想再次传递所有工厂参数。

ViewModelProvider.get文档所述:

  

返回现有的ViewModel或在范围内创建新的ViewModel

我想访问活动中定义的ViewModel实例,所以我尝试了以下操作,但是由于模型没有空的构造函数,因此在逻辑上会崩溃:

protected val viewModel: ReportViewModel by lazy {
    ViewModelProviders.of(requireActivity()).get(ReportViewModel::class.java)
}

如何在一个片段中访问其“出厂”的ViewModel?我们应该把工厂交给碎片吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

有点晚了,但是我自己有这个问题。我发现您可以执行以下操作:

在您的活动中像这样覆盖getDefaultViewModelProviderFactory()

override fun getDefaultViewModelProviderFactory(): ReportViewModelFactory {
    return ReportViewModelFactory(report)
}

现在您可以在片段中了

requireActivity().getDefaultViewModelProviderFactory()

去工厂。

或者简单地实例化您的viewModel:

private val viewModel: ReportViewModel by activityViewModels()