android - 在 Fragment 中使用 ViewModelFactory

标签 android kotlin fragment viewmodel

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

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

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

ViewModelProvider.get 文档所述:

Returns an existing ViewModel or creates a new one in the scope

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

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

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

谢谢!

最佳答案

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

在你的 Activity 覆盖 getDefaultViewModelProviderFactory() 像这样:

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

现在你可以在你的 fragment 中做

requireActivity().getDefaultViewModelProviderFactory()

去工厂。

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

private val viewModel: ReportViewModel by activityViewModels()

关于android - 在 Fragment 中使用 ViewModelFactory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58233784/

相关文章:

android - 如何在 fragment 中隐藏 Activity View

android - 如何更改 MaterialAlertDialog 中项目的文本颜色?

gradle - 如何使用Kotlin DSL访问Gradle项目的插件特定属性?

java - fragment 上的传感器管理器(如果可见则添加;如果不可见则删除)

android - 如何使用 ARCore Camera 拍摄带有物体的图像?

findbugs - 如何使用 Findbugs 避免 kotlin 文件

android - 从 RecyclerView 单击 CardView 加载 fragment

xml布局中的android View url

Android dumpsys meminfo "Swapped Dirty"列是什么意思?

android - 为什么我在 Android 上的 XML 文件被截断为 1000 字节