【发布时间】:2018-07-17 12:50:15
【问题描述】:
我看过很多教程,但并没有真正让自己正确理解如何在 MVVM 中处理某些情况。
假设有一个存储库从使用Room 的DAO 获取数据
class Repository(){
fun getItems() = itemsDAO.getItems()
}
查询存储库的 ViewModel
class FragmentViewModel:ViewModel(){
val items = repository.getItems()
fun updateItem(Item item){
repository.updateImte(itemm)
}
}
还有一个片段
class MyFragment:Fragment(){
//onViewCreated
viewModel.items.observe(...){
//if result, update the views
}
buttonUpdateItem.setOnClickListener{
viewModel.updateItem(Item item)
}
}
这是我从教程中了解到的方法。基本上我有一些事情要澄清,我想请你帮忙。
一个。鉴于ViewModel 的这种实现,如果用户旋转设备并重新创建片段,这是否意味着在添加observe 时将再次查询数据库?
我正在考虑更新版本的 ViewModel,例如
class FragmentViewModel:ViewModel(){
private final var itemsObservable;
init {
itemsObservable = repository.getItems()
}
fun items(){
return itemsObservable
}
fun updateItem(Item item){
repository.updateImte(item)
}
}
如果我是对的,这应该允许从 db 返回初始值,并且在片段重新创建的情况下不会再次调用 db。
b. ViewModel 应该如何作用于Fragment 交互,更精确地处理按钮单击事件? fragment 是否应该像上面的示例那样调用viewModel.updateItem 函数或viewModel 应该返回一个应该设置为按钮的onClickListener 变量?
c。传递给fragment 的参数是否也应该添加到ViewModel?
d。如您所见,ViewModel 保存了LiveData<List<>> 的变量,例如,如果我想更新一个项目,那么fragment 将传递Item。这是一个好方法吗?
【问题讨论】:
标签: android mvvm viewmodel android-viewmodel