在 Fragment 中使用 ViewModelFactory

lor*_*nzo 3 android fragment viewmodel kotlin

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

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

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

ViewModelProvider.get文档所述:

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

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

protected val viewModel: ReportViewModel by lazy {
    ViewModelProviders.of(requireActivity()).get(ReportViewModel::class.java)
}
Run Code Online (Sandbox Code Playgroud)

应该如何在片段中访问其“工厂化”的 ViewModel?我们应该将工厂传递给片段吗?

谢谢!

小智 6

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

在您的活动覆盖中,getDefaultViewModelProviderFactory()如下所示:

override fun getDefaultViewModelProviderFactory(): ReportViewModelFactory {
    return ReportViewModelFactory(report)
}
Run Code Online (Sandbox Code Playgroud)

现在在你的片段中你可以做

requireActivity().getDefaultViewModelProviderFactory()
Run Code Online (Sandbox Code Playgroud)

得到工厂。

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

private val viewModel: ReportViewModel by activityViewModels()
Run Code Online (Sandbox Code Playgroud)