【问题标题】:androidx.lifecycle.ViewModelStoreOwner in ViewModelProvider cannot be applied to androidx.lifecycle.LifeCycleOwnerViewModelProvider中的androidx.lifecycle.ViewModelStoreOwner不能应用到androidx.lifecycle.LifeCycleOwner
【发布时间】:2020-02-28 06:18:34
【问题描述】:

我正在尝试在 Fragment 中实现 ViewModel、LiveData。通过Medium Blog 之后,我尝试在声明ViewModel 对象时使用getViewLifecycleOwner() 方法。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
viewModel = new ViewModelProvider(getViewLifecycleOwner()).get(MainActivityViewModel.class);
}

但它显示以下错误,

ViewModelProvider 中的

androidx.lifecycle.ViewModelStoreOwner 不能应用于 androidx.lifecycle.LifeCycleOwner

当我尝试将其投射到 ViewModelStoreOwner 时,应用程序崩溃并显示以下错误,

java.lang.ClassCastException: androidx.fragment.app.FragmentViewLifecycleOwner 无法转换为 androidx.lifecycle.ViewModelStoreOwner

如何有效地用ViewModel声明Fragment的生命周期?

【问题讨论】:

  • 博文描述的问题是在 observe 时使用了错误的 LifecycleOwner,而不是获取 ViewModel。

标签: android mvvm viewmodel classcastexception android-viewmodel


【解决方案1】:

使用它来将您的视图模型范围限定为您的片段:

viewModel = new ViewModelProvider(this).get(MainActivityViewModel.class);

或者,如果您希望将其限制在您的活动范围内:

viewModel = new ViewModelProvider(requireActivity()).get(MainActivityViewModel.class);

【讨论】:

  • 我必须将视图模型的范围设置为我的片段,我已经完成了您在 onViewCreated() 中提到的相同操作,也尝试使用 onCreateView(),视图模型一次又一次地重新初始化,导致多次设置观察者..如何解决这个问题?
【解决方案2】:

片段是LifecycleOwner 的子类。所以可以直接将Fragment引用传递给LifecycleOwner参数。

代码会是这样的。

viewModel = new ViewModelProvider(this).get(MainActivityViewModel.class);

【讨论】:

  • 我已经做了和你在 onViewCreated() 中提到的一样的事情,也尝试了 onCreateView(),ViewModel 一次又一次地重新初始化,导致多次设置观察者。
  • 另外,您可以检查 ViewModel 是否已经初始化。如果它为 null,则仅将新的 ViewModel 分配给它。
猜你喜欢
  • 2018-11-24
  • 2023-01-14
  • 1970-01-01
  • 2022-08-20
  • 1970-01-01
  • 1970-01-01
  • 2021-04-03
  • 2021-07-14
  • 2020-01-05
相关资源
最近更新 更多