Android ViewModel的职责是仅保留数据或保留数据+;视图控制器?
据我们所知 ViewModel类旨在以生命周期意识的方式存储和管理与UI相关的数据 但我认为很多开发人员使用Android ViewModel的职责是仅保留数据或保留数据+;视图控制器?,android,android-architecture-components,android-viewmodel,android-mvp,Android,Android Architecture Components,Android Viewmodel,Android Mvp,据我们所知 ViewModel类旨在以生命周期意识的方式存储和管理与UI相关的数据 但我认为很多开发人员使用ViewModel作为数据存储和控制器(比如调用存储库、网络客户端获取数据)。我还将as用于数据存储和控制器以供查看 Android官方示例代码也有一些控制器逻辑。发件人: 类MyViewModel:ViewModel(){ 私有val用户:惰性的MutableLiveData{ MutableLiveData()。同样{ loadUsers() } } fun getUsers():Li
ViewModel
作为数据存储和控制器(比如调用存储库、网络客户端获取数据)。我还将as用于数据存储和控制器以供查看
Android官方示例代码也有一些控制器逻辑。发件人:
类MyViewModel:ViewModel(){
私有val用户:惰性的MutableLiveData{
MutableLiveData()。同样{
loadUsers()
}
}
fun getUsers():LiveData{
返回用户
}
私人娱乐用户(){
//执行异步操作以获取用户。
}
}
在这里,loadUsers
可能会调用一些存储库或网络客户端。在这里,它就像控制器
我相信很多开发人员都是这样做的,但是从定义上看,ViewModel
应该存储和管理与UI相关的数据,而ViewModel
应该充当控制器吗
我发现了一些stackoverflow线程和关于此的信息
第一个被接受的答案建议不要将ViewModel
用作控制器,而将控制器用于其他任务
在第二个one的评论部分@commonware还建议不要使用数据以外的复杂事物
所以我的问题是
ViewModel
的实际责任是什么视图
和控制器,以便在片段之间进行设备旋转和共享控制器loadUsers()
可能会调用某个存储库或网络客户端。在这里,它就像控制器
我相信很多开发人员都是这样做的,但从定义上看,ViewModel应该存储和管理与UI相关的数据,ViewModel应该充当控制器吗
理论上,数据检索应该是LiveData
内部的,由活动观察者触发,并基于此决定要做什么(在onActive()
)。如果LiveData实际上是一个MediatorLiveData
,那么这也适用于与addSource
绑定的任何块,因为只有当活动观察者观察到MediatorLiveData时,才调用添加了addSource
的MediatorLiveData
的块
您可以在中看到这项技术得到了最充分的应用。ViewModel只存储数据,不知道数据加载
从建筑概念来看,ViewModel的实际职责是什么
如果您看到Yigit Boyar(查看模型的创建者)的评论:
我是添加它的人(或团队的一部分),它与MVVM无关。这一切都是为了给人们一个应该把数据放在哪里的课程
AAC不是MVVM实现,VM概念也不是MVVM的一部分
其实,主要的动机是,;我们一直在告诉开发人员不要在UI控制器中管理数据,答案也是,那么在哪里呢?而ViewModel就是答案
我们希望它成为您的视图层(片段、活动等)的模型。事后看来,最好选择一个新名字,但命名确实很难
总之:ViewModel是MVC场景中的模型,其中C
是活动或片段,V
是膨胀视图,M
是ViewModel
如果我必须做一些与视图相关的方法调用[如数据查询、网络调用和其他与业务登录相关的东西],我应该在哪里做
ViewModel以LiveData的形式获取数据,LiveData通过在给定生命周期的视图中观察而“激活”
网络调用也应该以相同的方式触发(如果按照LiveData设计的方法进行)
理论上,如果您有一个登录调用,那么您也可以在控制器中而不是在模型中进行,这样您就可以在片段中进行,即使有一些技巧,比如Jetpack数据绑定,可以让您直接从XML从模型的视图中调用方法
若我必须使用控制器,那个么我如何连接视图和控制器以进行设备旋转,并在片段之间共享控制器
ViewModel公开LiveData
,并且可能也会公开,但两者都不是命令绑定),如果需要,视图或控制器都可以直接对其调用方法。ViewModel跨配置更改(而不是跨进程死亡,ofc)存储,因此它不应包含直接视图引用。谢谢您的回答。如果我使用Controller
,那么我如何在片段之间共享Controller
的相同实例?就像我现在用ViewModel
在片段之间共享同一个VM实例一样。制作Controller
Singletone?如果数据检索应该是LiveData
内部的,那么对于每个LiveData
我必须在LiveData
中插入存储库
或DataSource
,对吗?控制器就是片段。“模型”是视图模型。您可以通过使用共享超级作用域(Activity、NavBackbackEntry或具有ViewModelStore的自定义对象)在片段之间共享ViewModel,您不能在片段之间共享片段(从技术上讲,您可以使用findFragmentByTag
,但这很棘手)。调用存储库方法而不实际调用LiveData
class MyViewModel : ViewModel() {
private val users: MutableLiveData<List<User>> by lazy {
MutableLiveData().also {
loadUsers()
}
}
fun getUsers(): LiveData<List<User>> {
return users
}
private fun loadUsers() {
// Do an asynchronous operation to fetch users.
}
}