繁体   English   中英

由于不推荐使用 ViewModelProviders.of(),我应该如何创建 ViewModel 的 object?

[英]As ViewModelProviders.of() is deprecated, how should I create object of ViewModel?

我一直在尝试在 Activity 中创建 ViewModel 的 Object 但不推荐使用 ViewModelProviders 那么创建 ViewModel 的 object 的替代方法是什么。

只需更换:

这个:

boardViewModel = ViewModelProviders.of(this).get(BoardViewModel::class.java)

有了这个:

boardViewModel = ViewModelProvider(this).get(BoardViewModel::class.java)

这个 Gradle 升级给我带来了问题。

implementation 'androidx.core:core:1.1.0'

implementation 'androidx.core:core:1.2.0'

主要活动 Java/Kotlin 文件

这个导入语句

import androidx.lifecycle.ViewModelProviders

必须改为

import androidx.lifecycle.ViewModelProvider

这个 KOTLIN viewModel 语句

viewModel = ViewModelProviders.of(this).get(MainActivityViewModel::class.java)

必须改为

viewModel = ViewModelProvider(this).get(MainActivityViewModel::class.java)

在 JAVA 中

这行JAVA代码

mViewModel = ViewModelProviders.of(this).get(MainActivityViewModel.class);

必须改为

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

然后这一切都对我有用。

基于:对我造成问题的步骤概述在此处输入图像描述

ViewModelProviders.of() 已被弃用。 在此处输入图像描述

直接使用 ViewModelProvider 构造函数,因为它们现在处理默认的 ViewModelProvider.Factory 角色。

爪哇

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

科特林

mainActivityViewModel = ViewModelProvider(this).get(MainActivityViewModel::class.java)

我们现在应该使用ViewModelProvider构造函数而不是ViewModelProviders ,它具有三个:

public ViewModelProvider(ViewModelStoreOwner owner)
public ViewModelProvider(ViewModelStoreOwner owner, Factory factory)
public ViewModelProvider(ViewModelStore store, Factory factory)

1.如果您不使用ViewModelProvider.Factory 将其他参数传递给您的ViewModel ,您可以使用第一个。 所以:

viewModel = ViewModelProviders.of(this).get(YourViewModel.class);

可以替换为:

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

AppCompatActivity和不同种类的FragmentViewModelStoreOwner的间接子类( 在此处查看其已知子类的完整列表),因此您可以在此构造函数中使用它们。

2.但是如果你使用ViewModelProvider.Factory ,你应该使用第二个或第三个构造函数:

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

可以替换为:

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

或基于ViewModelStore文档

使用 ViewModelStoreOwner.getViewModelStore() 为活动和片段检索 ViewModelStore。

viewModel = new ViewModelProvider(getViewModelStore(), viewModelFactory).get(YourViewModel.class);

ViewModelProviders.of() 已被弃用。 您可以将 Fragment 或 FragmentActivity 传递给新的 ViewModelProvider(ViewModelStoreOwner) 构造函数以实现相同的功能。 (aosp/1009889)

请点击这里查看解决方案

如果您使用的是 Kotlin,而不是:

private lateinit var viewModel: EntityGridViewModel

[...]

// Deprecated
viewModel = ViewModelProviders.of(this).get(EntityGridViewModel::class.java)

你可以使用更好的:

private val viewModel: EntityGridViewModel by viewModels()

接下来几个月的简单选择是坚持使用稳定版或测试版。 ViewModelProviders仅从2.2.0开始被弃用,目前在alpha03版本中。

对于当您迁移到2.2.0或更高版本的生命周期依赖项时,您的选项取决于您的语言:

  • 如果您使用 Java,请使用ViewModelProvider()构造函数,传入您的活动或片段

  • 如果您使用的是 Kotlin,则应该有一个by viewModels()属性委托,尽管我在源代码中没有找到它...

对于java

简单地替换这个:

viewModel = ViewModelProviders.of(this).get(YOUR_VIEW_MODEL::class.java)

有了这个:

viewModel = ViewModelProvider(this).get(YOUR_VIEW_MODEL::class.java)

如果你有自己的工厂,那么,

viewModel = 
ViewModelProvider(this,YOUR_FACTORY).get(YOUR_VIEW_MODEL::class.java)

对于kotlin :有一种更好的方法可以做到这一点。 您可以在 app build.gradle中添加以下依赖项:

//for activity
implementation "androidx.activity:activity-ktx:1.3.0-alpha06"
//for fragment
implementation "androidx.fragment:fragment-ktx:1.3.2"

然后访问视图模型,如下所示:

private val viewmodel: YOUR_VIEW_MODEL by viewModels()

如果你有自己的视图模型工厂,

  private val viewmodel: YOUR_VIEW_MODEL by viewModels { YOUR_VIEW_MODEL_FACTORY }

这段代码对我有用

private lateinit var viewModel: MainViewModel
viewModel = ViewModelProvider(this, ViewModelProvider.NewInstanceFactory()).get(MainViewModel::class.java)

此类已弃用。 直接使用 ViewModelProvider 的构造函数。 这里

所以而不是使用这个

ViewModelProviders.of(this).get(MyViewModel.class); - deprecated

用这个

new ViewModelProvider(this).get(MyViewModel.class); - correct

由于ViewModelProviders已被弃用。 您现在可以直接使用ViewModelProvider构造函数。 有关如何使用它的更多详细信息,请查看此处

您可以在 app build.gradle中添加以下依赖项:

//for activity
implementation "androidx.activity:activity-ktx:1.2.2"
//for fragment
implementation "androidx.fragment:fragment-ktx:1.3.2"

然后像下面这样使用:

private val viewmodel: YOUR_VIEW_MODEL_CLASS_NAME by viewModels()

如果你有自己的视图模型工厂,

  private val viewmodel: YOUR_VIEW_MODEL_CLASS_NAME by viewModels { YOUR_VIEW_MODEL_FACTORY }
private lateinit var vm: SRViewModel
private lateinit var adapter: StudentRecordsAdapter

已弃用

vm = ViewModelProviders.of(this)[SRViewModel::class.java]

使用这行代码

vm=  ViewModelProvider(this)[SRViewModel::class.java]

生命周期扩展 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM