【问题标题】:Initializing ViewModel in fragment Android java在片段Android java中初始化ViewModel
【发布时间】:2020-04-23 19:38:42
【问题描述】:

我正在尝试在BasicActivityFirstFragment.java 文件中初始化我的视图模型对象。这四个代码都失败了。文档对我帮助不大。

mViewModel = new ViewModelProvider(this).get(MyViewModel.class);
mViewModel = new ViewModelProvider(requireActivity()).get(MyViewModel.class);
mViewModel = new ViewModelProvider(getActivity()).get(MyViewModel.class);
mViewModel = new ViewModelProvider(FirstFragment.class).get(MyViewModel.class);

另一方面,public ViewModelProvider(@NonNull ViewModelStoreOwner owner)ViewModelProvider 以 ViewModelStoreOwner 为参数,在ViewModelStore 接口的FragmentActivity.java ViewModelStore getViewModelStore() 方法中实现的可能是工厂模式。

@NonNull
        @Override
        public ViewModelStore getViewModelStore() {
            return FragmentActivity.this.getViewModelStore();
        }

帮我初始化 ViewModel

【问题讨论】:

  • “所有这四个代码都失败了” - 您是否遇到运行时错误?如果是,Logcat 中有哪些错误信息?请展示更多您的代码/项目结构(ViewModel 呢?及其父类、构造函数...)TL;DR 请添加足够的信息,以便我们设置一个小示例应用程序并尝试重现错误
  • 我已经解决了。实际上是房间注释依赖项使我无法创建数据库单音对象并最终无法初始化视图模型。

标签: java android mvvm fragment android-jetpack


【解决方案1】:

初始化你的 viewModel 如下:

如果你正在使用

implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'

并初始化您的视图模型

viewModel = ViewModelProviders.of(this,viewModelFactory).get(MyViewModel.class);

但它现在已被弃用。 所以将依赖更新为:

implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'

并将您的 viewModel 初始化如下:

viewModel = new ViewModelProvider(this,viewModelFactory).get(MyViewModel.class);

viewModelFactory 是可选的。

【讨论】:

  • ViewModelProviders 已折旧。在docs 中,它被告知直接使用 ViewModelProvider 构造函数。
猜你喜欢
  • 2020-12-26
  • 2020-11-26
  • 2021-04-13
  • 2019-02-27
  • 2021-12-19
  • 2021-04-04
  • 1970-01-01
  • 1970-01-01
  • 2021-01-16
相关资源
最近更新 更多