使用 ViewModel 构造函数而不是 ViewModelProvider 能够根据参数从房间数据库获取数据



当将房间数据库与基于此Codelab的ViewModel和LiveDate一起使用时,为了使用带有参数的查询,我没有找到任何解决方案,所以我尝试为视图模型类和存储库类创建另一个构造函数,但我注意到在CodeLab中,他们根本不使用视图模型构造函数,而是使用视图模型提供程序,所以我更改了它并使用
new StoryViewModel(getApplication(),"Fiction");
而不是new ViewModelProvider(this).get(StoryViewModel.class);

我不知道这是否有任何问题。
它现在工作正常,但如果是这样,为什么我们不总是使用它呢
为什么我们使用视图模型提供程序?

如果我做的是错误的,那么我如何根据参数从数据库检索数据?

谢谢。

你不应该直接使用viewModel构造函数,因为系统会创建viewModel或从缓存中获取它。如果要将参数传递给视图模型构造函数,则应使用如下所示的视图模型工厂:

class ViewModelFactory(params) : ViewModelProviders.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
return modelClass.getConstructor(params::class.java).newInstance(params);
}
}
...
override fun onCreate(...) {
viewModel = ViewModelProviders.of(this, ViewModelFactory(params)).get(MyViewModel::class.java)s
}

这是一个完整的示例,它是根据我从Pierluigi的答案中获得的知识构建的:

class MyFragment: Fragment() {
private lateinit var viewModel: ContactViewModel
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
activity?.let { activity ->
viewModel = ViewModelProvider(
activity,
MyViewModelFactory(
"mode value",
"nickname value"
)
).get(MyViewModel::class.java)
} ?: throw AssertionError("Unable to get parent activity from fragment")
}
}
class MyViewModelFactory(val mode: String, val nickname: String) : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T =
modelClass.getConstructor(String::class.java, String::class.java)
.newInstance(mode, nickname)
}
class MyViewModel(val mode: String, val nickname: String) : ViewModel()

相关内容

  • 没有找到相关文章

最新更新