当前位置: 首页 > 知识库问答 >
问题:

在1.1.0中不建议使用ViewModelProviders

舒枫涟
2023-03-14

查看ViewModel的谷歌文档,它们显示了下面关于如何获取ViewModel的示例代码:

val model = ViewModelProviders.of(this).get(MyViewModel::class.java)

当使用最新的依赖项android.arch.lifecycle:扩展:1.1.1时,没有这样的类ViewModelProviders

转到ViewModelProviders的文档,我看到一条评论说:

这个类在API级别1.1.0中被弃用。使用ViewModelProvider。Android模型工厂

问题是,当尝试使用ViewModelProvider时。AndroidViewModelFactory,找不到方法的等效,无法获取ViewModel的实例。

我尝试做的事情:

ViewModelProvider.AndroidViewModelFactory.getInstance(application).create(PlayerViewHolder::class.java)

因此,方法名为create,每次调用它时,我都会得到ViewModel的一个新实例,这不是我想要的。

有什么想法可以替代上面不推荐的代码吗?


共有3个答案

朱俭
2023-03-14

不推荐来自:


       
  
   
        import androidx.lifecycle.ViewModelProviders;
       
  

致:

import androidx.lifecycle.ViewModelProvider;

不推荐来自:


       
  
   
        ViewModelProviders.of
       
  (this, provider).get(VM::class.java)

致:

ViewModelProvider(this, provider).get(VM::class.java)
邹齐智
2023-03-14

正如@FantasySquare在他的回答中提到的那样,使用生命周期的最新版本:生命周期扩展,此时是2.2.0-alpha03。因此,您应该在build.gradle文件中添加以下行:

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

对于使用Java的用户,要解决此问题,请将这些参数直接传递给ViewModelProvider的构造函数:

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

或者,如果您不使用工厂,只需使用:

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

不通过工厂对象。

墨翔宇
2023-03-14

我使用生命周期扩展2.2.0版本:

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

它应该工作,使用ViewModelProvider构造函数。

// With ViewModelFactory   
val viewModel = ViewModelProvider(this, YourViewModelFactory).get(YourViewModel::class.java)


//Without ViewModelFactory
val viewModel = ViewModelProvider(this).get(YourViewModel::class.java)

2020/5/15更新

我找到了另一种优雅的方法来实现这一点,AndroidKTX可以帮助

implementation "androidx.fragment:fragment-ktx:1.2.4"
val viewmodel: MYViewModel by viewModels()
val viewmodel: MYViewModel by viewModels { myFactory } //With factory

裁判:https://developer.android.com/reference/kotlin/androidx/fragment/app/package-summary#viewmodels

2020/06/25:纠正代表的情况

 类似资料:
  • 本文向大家介绍在css中为什么说不建议使用@import?相关面试题,主要包含被问及在css中为什么说不建议使用@import?时的应答技巧和注意事项,需要的朋友参考一下 @import 属于 CSS,所以导入语句应写在 CSS 中,要注意的是导入语句应写在样式表的开头,否则无法正确导入外部文件; @import 是 CSS2.1 才出现的概念,所以如果浏览器版本较低,无法正确导入外部样式文件;

  • 问题内容: 我有以下代码将JasperReprot导出到XLS: 升级到 JasperReports 5.6, 所有setParameter都标记为“已弃用”,我找不到适合此代码的文档。 如何使用 JasperReports 5.6 将报告导出到xls ? 问题答案: JRExporter在5.6中已弃用。他们引入了新的接口Exporter,并对所有的Exporter进行了改造,使其具有Expor

  • 问题内容: 今天,由于扩展程序出现问题,我不得不重新启动浏览器。重新启动时发现,我的浏览器(Chromium)自动更新为不再允许同步AJAX请求的新版本。引用: 不赞成在主线程上使用同步XMLHttpRequest,因为它会对最终用户的体验产生不利影响。如需更多帮助,请访问http://xhr.spec.whatwg.org/。 我需要node.js应用程序的同步AJAX请求才能工作,因为它们通过

  • 问题内容: 我有一个Elasticsearch索引,其中有一些数据。我实现了该功能,所以当用户写错拼写的东西时,它可能会收到带有正确单词的建议。 之所以使用短语建议者,是因为我需要一些简短的短语(例如名称)的建议,问题是索引中不存在某些建议。 例: 我的问题是,索引中没有与指定建议匹配的词组,因此它向我推荐了不存在的词组,因此会给我一个未找到的搜索词。 我该怎么办?短语建议者是否应该为索引中实际存

  • 问题内容: 我有这种方法: 不幸的是,编译器向我显示了以下问题: 因为已弃用。 不使用该如何改写此方法? 问题答案: 您可以用和替换它(您需要使用兼容性包来支持API版本11之前的设备)。 但是,您似乎只使用了一次查询:您甚至可能不需要它。也许这行得通吗?

  • 问题内容: 我最近一直在使用Hibernate 3.5和Spring 3进行一些工作,但是我对Hibernate还是比较陌生,并认为Spring中的类使将Hibernate与我的域类一起使用变得容易且容易。 但是,在搜索一个不相关的问题时,我看到有人提到,这不是使用Spring和Hibernate的最佳方法。任何人都可以阐明以下几点: 为什么不推荐? 整合Hibernate和Spring的最佳方法