ViewModelProvider中的androidx.lifecycle.ViewModelStoreOwner不能应用于androidx.lifecycle.LifeCycleOwner

ViewModelProvider中的androidx.lifecycle.ViewModelStoreOwner不能应用于androidx.lifecycle.LifeCycleOwner,android,mvvm,viewmodel,classcastexception,android-viewmodel,Android,Mvvm,Viewmodel,Classcastexception,Android Viewmodel,我试图在片段中实现ViewModel和LiveData。在阅读了之后,我尝试在声明ViewModel对象时使用getViewLifecycleOwner()方法 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { viewModel = new ViewModelProvider(

我试图在片段中实现ViewModel和LiveData。在阅读了之后,我尝试在声明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
高效地声明
片段的生命周期?

使用此选项将ViewModel的范围限定到片段:

viewModel = new ViewModelProvider(this).get(MainActivityViewModel.class);
或者,如果您希望将其范围限定为您的活动:

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

Fragment是
LifecycleOwner
的子类。因此,您可以直接将
Fragment
引用传递给
LifecycleOwner
参数

代码将是这样的

viewModel=newviewmodelprovider(this.get)(MainActivityViewModel.class);

这篇博客文章描述的问题是,当你观察时,使用了错误的
生命周期所有者
,而不是获取ViewModel。我必须将ViewModel的范围设置为我的片段,我已经做了与你在onViewCreated()中提到的相同的操作,还尝试了onCreateView(),viewmodel一次又一次地重新初始化,这导致多次设置观察者。。如何解决此问题?我已经完成了与您在onViewCreated()中提到的相同的操作,也尝试了onCreateView(),ViewModel正在一次又一次地重新初始化,这导致多次设置观察者。此外,您可以检查ViewModel是否已初始化。如果为空,则仅为其指定新的ViewModel。