如何在 2020/21 的活动中获取 ViewModel 的实例?

Ger*_*rke 24 android mvvm viewmodel androidx viewmodelproviders

我是 mvvm 模式的新手。我为主要活动创建了一个 ViewModel。现在我想在主活动中获取 ViewModel 的一个实例。

Stackoverflow 上的大多数教程和答案都建议使用ViewModelProviders.of(...,但已弃用。

因此,根据stackoverflow上的这个问题:ViewModelProviders is deprecated in 1.1.0 main activity in onCreate,我执行以下操作(我可以发誓我已经运行了它):mainActivityViewModel = new ViewModelProvider(this).get(MainActivityViewModel.class);

但是,我收到一个错误消息,告诉我没有找到合适的构造函数。

error: no suitable constructor found for ViewModelProvider(MainActivity)

或者,绝对清楚,MainActivity 应为 ViewModelStoreOwner,我创建了一个变量 ViewModelStoreOwner vmso = this;并将该变量放入构造函数中,如下所示: mainActivityViewModel = new ViewModelProvider(vmso).get(MainActivityViewModel.class);

Ant*_*res 31

您应该将 gradle 文件更新为:

实现 'androidx.lifecycle:lifecycle-extensions:2.2.0'

由于此更改,您可以将 Activity 传递给您提到的构造函数:

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


小智 18

根据Android文档,您可以这样做:

科特林

implementation 'androidx.activity:activity-ktx:1.3.1'

val model: MyViewModel by viewModels()
Run Code Online (Sandbox Code Playgroud)

爪哇

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

MyViewModel model = new ViewModelProvider(this).get(MyViewModel.class);
        
Run Code Online (Sandbox Code Playgroud)


Alo*_*hra 12

在您的应用程序中使用Fragment-ktx libr,您可以获得如下所示的 viewModel

首先将 Gradle 文件更新为 app -> build.gradle

implementation 'androidx.fragment:fragment-ktx:1.1.0'
Run Code Online (Sandbox Code Playgroud)

//获取视图模型活动片段作为

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

//如果你想获得的同一实例视图模型ChildFragment作为

 private val viewModel: MainActivityViewModel by viewModels(
    ownerProducer = { requireParentFragment() }
)
Run Code Online (Sandbox Code Playgroud)

  • Fragment-ktx 用于片段。我们需要 **activity-ktx** (4认同)

Boy*_*Boy 9

val viewModel by viewModels<TheViewModel>()在活动和val viewModel by activityViewModels<TheViewModel>()片段中使用从活动中获取相同的视图模型(因此共享视图模型)。

这是androidx现在的一部分

  • 谢谢!这对大多数人来说可能是显而易见的,但您也可以执行 `val viewModel: ThisViewModel by viewModels()` 和 `val viewModel: ThisViewModel by ActivityViewModels()` (4认同)

小智 6

以新方式获取 ViewModel

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

  • 这是Java。我们使用科特林。 (2认同)