我是mvvm模式的新手。我为主要活动创建了一个ViewModel。现在,我想在主活动中获取ViewModel的实例。
此处有关Stackoverflow的大多数教程和答案建议使用ViewModelProviders.of(...
,但已弃用。
所以根据这个关于stackoverflow的问题:ViewModelProviders is deprecated in 1.1.0 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);
答案 0 :(得分:14)
您应该将gradle文件更新为:
实现'androidx.lifecycle:lifecycle-extensions:2.2.0'
由于此更改,您可以将Activity传递给您提到的构造函数:
mainActivityViewModel = new ViewModelProvider(this).get(MainActivityViewModel.class);
答案 1 :(得分:4)
在应用中使用Fragment-ktx库,您可以按照以下方式获取viewModel
implementation 'androidx.fragment:fragment-ktx:1.1.0'
//在活动或片段中以
的形式获取 ViewModel
private val viewModel: MainActivityViewModel by viewModels()
//如果要在 ChildFragment 中获得与
相同的 ViewModel 实例
private val viewModel: MainActivityViewModel by viewModels(
ownerProducer = { requireParentFragment() }
)
答案 2 :(得分:2)
在“活动”中使用val viewModel by viewModels<TheViewModel>()
,在片段中使用val viewModel by activityViewModels<TheViewModel>()
,从活动中获取相同的视图模型(因此共享视图模型)。
这是androidx
的一部分
答案 3 :(得分:2)
以新方式获取ViewModel
MainActivityViewModel mainActivityViewModel;
mainActivityViewModel= new ViewModelProvider(this).get(MainActivityViewModel.class);
答案 4 :(得分:1)
就目前而言,对我来说唯一有用的就是使用:
MainActivityViewModel = new ViewModelProvider(this, new ViewModelProvider.NewInstanceFactory()).get(MainActivityViewModel.class);
但是,我仍然感谢任何建议,如何使用new ViewModelProvider(this).get(MainActivityViewModel.class);
答案 5 :(得分:0)
ViewModel viewModel = ViewModelProviders.of(this).get(ViewModel.class);
Android支持库版本已弃用。因此,您需要确保导入Androidx。并且您需要在Gradle文件中实现androidx依赖。
不建议使用“ new”关键字创建新的ViewModel对象。
答案 6 :(得分:0)
您可以使用ViewModelFactory
:
val viewModelFactory = VMFactory(requireActivity().application)
viewModel= ViewModelProvider(requireActivity(),viewModelFactory).get(MainViewModel::class.java)
VMFactory代码:
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
,因此需要应用作为输入参数。
答案 7 :(得分:0)
我遇到了类似的问题,最后发现我错过了类定义中的“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;
}
答案 8 :(得分:-1)
Duplicate question and already answered here
只需替换:
此:
boardViewModel = ViewModelProviders.of(this).get(BoardViewModel::class.java)
与此:
boardViewModel = ViewModelProvider(this).get(BoardViewModel::class.java)