[英]Get the same instance of ViewModel in Fragment which is defined in Activity with parameter
[英]How to get an Instance of ViewModel in activity in 2020/21?
我是 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);
您应该将 gradle 文件更新为:
实现 'androidx.lifecycle:lifecycle-extensions:2.2.0'
由于此更改,您可以将 Activity 传递给您提到的构造函数:
mainActivityViewModel = new ViewModelProvider(this).get(MainActivityViewModel.class);
在您的应用程序中使用Fragment-ktx libr ,您可以获得如下所示的 viewModel
implementation 'androidx.fragment:fragment-ktx:1.1.0'
// 获取Activity或Fragment 中的ViewModel as
private val viewModel: MainActivityViewModel by viewModels()
// 如果你想在ChildFragment 中获得相同的ViewModel实例
private val viewModel: MainActivityViewModel by viewModels(
ownerProducer = { requireParentFragment() }
)
在活动中val viewModel by viewModels<TheViewModel>()
使用val viewModel by viewModels<TheViewModel>()
在片段中val viewModel by activityViewModels<TheViewModel>()
使用val viewModel by viewModels<TheViewModel>()
从活动中获取相同的视图模型(因此共享视图模型)。
这是现在androidx
一部分
目前,唯一对我有用的是使用: MainActivityViewModel = new ViewModelProvider(this, new ViewModelProvider.NewInstanceFactory()).get(MainActivityViewModel.class);
但是,我仍然感谢任何建议,如何使用new ViewModelProvider(this).get(MainActivityViewModel.class);
以新方式获取 ViewModel
MainActivityViewModel mainActivityViewModel;
mainActivityViewModel= new ViewModelProvider(this).get(MainActivityViewModel.class);
简单替换:
这个:
boardViewModel = ViewModelProviders.of(this).get(BoardViewModel::class.java)
有了这个:
boardViewModel = ViewModelProvider(this).get(BoardViewModel::class.java)
您可以使用ViewModelFactory
:
val viewModelFactory = VMFactory(requireActivity().application)
viewModel= ViewModelProvider(requireActivity(),viewModelFactory).get(MainViewModel::class.java)
虚拟机工厂代码:
class VMFactory(application: Application) : ViewModelProvider.NewInstanceFactory() {
val _application: Application=application
@NonNull
override fun <T : ViewModel?> create(@NonNull modelClass: Class<T>): T {
return MainViewModel(_application) as T
}
}
请注意,这里我的MainViewModel
扩展了AndroidViewModel
,因此需要 application 作为输入参数。
我遇到了类似的问题,最后发现我错过了类定义中的“ extends ViewModel ”,所以它应该是这样的:
public class ViewModelClass extends ViewModel
{
// Tracks the score for Team A
public int scoreTeamA = 0;
// Tracks the score for Team B
public int scoreTeamB = 0;
}
ViewModel viewModel = ViewModelProviders.of(this).get(ViewModel.class);
Android 支持库版本已折旧。 所以你需要确保你导入了Androidx。 并且您需要在 Gradle 文件中实现 androidx 依赖项。
不建议使用“new”关键字创建新的 ViewModel 对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.