由于 ViewModelProviders.of() 已弃用,我应该如何创建 ViewModel 的对象?

Anc*_*ora 72 android viewmodel

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

Kno*_*wIT 126

简单替换:

这个:

boardViewModel = ViewModelProviders.of(this).get(BoardViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)

有了这个:

boardViewModel = ViewModelProvider(this).get(BoardViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)

  • 在 Java 中:“boardViewModel = new ViewModelProvider(this).get(BoardViewModel.class)” (33认同)

小智 41

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

implementation 'androidx.core:core:1.1.0'
Run Code Online (Sandbox Code Playgroud)

implementation 'androidx.core:core:1.2.0'
Run Code Online (Sandbox Code Playgroud)

主要活动 Java/Kotlin 文件

这个导入语句

import androidx.lifecycle.ViewModelProviders
Run Code Online (Sandbox Code Playgroud)

必须改为

import androidx.lifecycle.ViewModelProvider
Run Code Online (Sandbox Code Playgroud)

这个 KOTLIN viewModel 语句

viewModel = ViewModelProviders.of(this).get(MainActivityViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)

必须改为

viewModel = ViewModelProvider(this).get(MainActivityViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)

在 JAVA 中

这行JAVA代码

mViewModel = ViewModelProviders.of(this).get(MainActivityViewModel.class);
Run Code Online (Sandbox Code Playgroud)

必须改为

mViewModel = new ViewModelProvider(this).get(MainActivityViewModel.class);
Run Code Online (Sandbox Code Playgroud)

然后这一切都对我有用。

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


Joh*_*ohn 28

ViewModelProviders.of() 已被弃用。 在此处输入图片说明

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

爪哇

 mainActivityViewModel = new ViewModelProvider(this).get(MainActivityViewModel.class);
Run Code Online (Sandbox Code Playgroud)

科特林

mainActivityViewModel = ViewModelProvider(this).get(MainActivityViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)

  • 这在我的例子中起到了作用。谢谢!值得一提的是,我必须将一些红色的“this”更改为“getViewLifecycleOwner()”以避免警告。 (3认同)

Ami*_*nak 10

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

public ViewModelProvider(ViewModelStoreOwner owner)
public ViewModelProvider(ViewModelStoreOwner owner, Factory factory)
public ViewModelProvider(ViewModelStore store, Factory factory)
Run Code Online (Sandbox Code Playgroud)

1.如果您使用的不是ViewModelProvider.Factory传递额外的参数给你ViewModel,你可以使用第一个。所以:

viewModel = ViewModelProviders.of(this).get(YourViewModel.class);
Run Code Online (Sandbox Code Playgroud)

可以替换为:

viewModel = new ViewModelProvider(this).get(YourViewModel.class);
Run Code Online (Sandbox Code Playgroud)

AppCompatActivity并且不同种类的Fragments 是的间接子类ViewModelStoreOwner(请参阅此处已知子类的完整列表),因此您可以在此构造函数中使用它们。

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

viewModel = ViewModelProviders.of(this, viewModelFactory).get(YourViewModel.class);
Run Code Online (Sandbox Code Playgroud)

可以替换为:

viewModel = new ViewModelProvider(this, viewModelFactory).get(YouViewModel.class);
Run Code Online (Sandbox Code Playgroud)

或基于上文档ViewModelStore

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

viewModel = new ViewModelProvider(getViewModelStore(), viewModelFactory).get(YourViewModel.class);
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的答案 (2认同)

Rag*_*n R 9

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

请点击这里查看解决方案


Raj*_*h.k 9

为了java

只需替换这个:

viewModel = ViewModelProviders.of(this).get(YOUR_VIEW_MODEL::class.java)
Run Code Online (Sandbox Code Playgroud)

有了这个:

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

如果你有自己的工厂那么

viewModel = 
ViewModelProvider(this,YOUR_FACTORY).get(YOUR_VIEW_MODEL::class.java)
Run Code Online (Sandbox Code Playgroud)

对于kotlin:有一个更好的方法来做到这一点。您可以在应用程序中添加以下依赖项build.gradle

//for activity
implementation "androidx.activity:activity-ktx:1.3.0-alpha06"
//for fragment
implementation "androidx.fragment:fragment-ktx:1.3.2"
Run Code Online (Sandbox Code Playgroud)

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

private val viewmodel: YOUR_VIEW_MODEL by viewModels()
Run Code Online (Sandbox Code Playgroud)

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

  private val viewmodel: YOUR_VIEW_MODEL by viewModels { YOUR_VIEW_MODEL_FACTORY }
Run Code Online (Sandbox Code Playgroud)


Com*_*are 7

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

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

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

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

  • 要使用“by viewModels()”,您需要添加此依赖项“implementation 'androidx.fragment:fragment-ktx:1.2.0'” (7认同)
  • @CommonsWare 根据最新版本 1.2.0 2020 年 1 月 22 日,viewModels() 和 ActivityViewModels() 出现在下面的依赖实现“androidx.fragment:fragment-ktx:1.2.0”中,此外,viewModels() 是用于活动和片段中的视图模型初始化。但通过activityViewModels()只能在fragment中使用来获取父activity的viewmodel。此外,在使用实现“androidx.activity:activity-ktx:xxx”时,我们只能在 Activity 中通过 viewModels() 访问,而不会在 Fragment 中访问它。 (4认同)

Bap*_*ier 7

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

private lateinit var viewModel: EntityGridViewModel

[...]

// Deprecated
viewModel = ViewModelProviders.of(this).get(EntityGridViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)

你可以使用更好的:

private val viewModel: EntityGridViewModel by viewModels()
Run Code Online (Sandbox Code Playgroud)


Sam*_*ami 5

这段代码对我有用

private lateinit var viewModel: MainViewModel
viewModel = ViewModelProvider(this, ViewModelProvider.NewInstanceFactory()).get(MainViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)