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
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)
val viewModel by viewModels<TheViewModel>()在活动和val viewModel by activityViewModels<TheViewModel>()片段中使用从活动中获取相同的视图模型(因此共享视图模型)。
这是androidx现在的一部分
小智 6
以新方式获取 ViewModel
MainActivityViewModel mainActivityViewModel;
mainActivityViewModel= new ViewModelProvider(this).get(MainActivityViewModel.class);
Run Code Online (Sandbox Code Playgroud)