【问题标题】:Using same viewmodel on different fragments在不同的片段上使用相同的视图模型
【发布时间】:2020-11-07 02:33:40
【问题描述】:

我在 Fragment A 上有 viewModel,我以这种方式加载:

viewModel = ViewModelProvider(this, viewModelFactory).get(AFragmentVM::class.java)

然后从片段 A,我转到片段 B。这可以在片段 B 上使用相同的视图模型吗?在 Fragment 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()

【问题讨论】:

    标签: android kotlin mvvm viewmodel


    【解决方案1】:

    如果两个片段在同一个活动中,你应该替换它:

    viewModel = ViewModelProvider(this, viewModelFactory).get(AFragmentVM::class.java)
    

    通过这个

    viewModel = ViewModelProvider(requireActivity(), viewModelFactory).get(AFragmentVM::class.java)
    

    并在 Activity 中添加一个 viewModel 并像这样在这个 Activity 中初始化它:

    viewModel = ViewModelProvider(this, viewModelFactory).get(AFragmentVM::class.java)
    

    使用 requireActivity() 在 Fragment 中设置 VM 时,您可以告诉 Fragment 使用活动共享 ViewModel

    【讨论】:

    • 是的,在同一个活动中,但我只有在片段 A 中有一个 viewModelFactory 的实例。所以我必须在活动中创建视图模型并将 viewModelFactory 移动到活动中?
    • 是的,这就是你必须要做的!
    【解决方案2】:

    片段 A

    viewModel  = ViewModelProvider(let {activity}!!,viewModelFactory).get(AFragmentVM::class.java)
    

    片段 B

     private lateinit var viewModel: AFragmentVM 
    

    【讨论】:

      猜你喜欢
      • 2016-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多