gpt4 book ai didi

Android ViewModel 的职责是只为 View 保存数据或保存数据+ Controller ?

转载 作者:行者123 更新时间:2023-12-04 13:35:52 28 4
gpt4 key购买 nike

来自 official我们知道

The ViewModel class is designed to store and manage UI-related data in a lifecycle conscious way



但我认为很多开发人员使用 ViewModel作为数据存储和 Controller (如调用存储库、数据的网络客户端)。我也将 as 用于数据存储和 View Controller 。

Android官方示例代码也有一些 Controller 逻辑。来自 official :
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.
}
}

这里 loadUsers可以调用一些 存储库网络客户端 .所以在这里它就像 Controller 一样。

我相信很多开发者都是这样做的,但是根据定义 ViewModel应该存储和管理 UI 相关数据,应该 ViewModel充当 Controller ?

我发现了一些 stackoverflow 线程 thisthis对这个。

第一个接受的答案建议不要使用 ViewModel作为 Controller 并使用 Controller 用于其他任务。

在第二个@commonsware 的评论部分也建议不要使用数据以外的复杂事物。

所以我的问题是
  • ViewModel 的实际责任是什么?从建筑概念?
  • 如果我必须做一些与 View 相关的方法调用[比如数据查询、网络调用和其他业务登录相关的东西]我应该在哪里做?
  • 如果我必须使用 Controller 那么我如何连接View Controller 用于 fragment 之间的设备旋转和共享 Controller ?

  • 希望我的问题对所有人都很清楚

    提前致谢。

    最佳答案

    Here loadUsers() may calling some Repository or NetworkClient . So here it acting like controller.

    I am sure many developer do this way, but as from definition ViewModel should store and manage UI related data, should ViewModel act as a Controller ?


    理论上,数据的检索应该在 LiveData 内部进行。 , 由 active observers 触发并在此基础上决定做什么(在 onActive() 中)。如果 LiveData 实际上是 MediatorLiveData ,那么这也适用于任何与 addSource 绑定(bind)的 block ,作为添加 addSource 的 block 的 MediatorLiveData仅当主动观察者观察到 MediatorLiveData 时才调用
    您可以在 the NetworkBoundResource 中看到这种技术已被充分利用。 . ViewModel 只存储数据,对数据加载一无所知。

    What will be the actual responsibility of ViewModel from architectural concept?


    如果您看到 Yigit Boyar( ViewModel 的创建者)的评论:

    I'm the guy (or part of the team) that added it and it had nothing to do w/ MVVM. It is all about trying to give a class to people where they should put the data.

    AAC is not an MVVM implementation, nor VM concept only lives as part of MVVM.

    In fact, the main motivation for this was; we've been telling devs not to manage data in the UI controller and the answers was also, so where? And ViewModel became that answer.

    We want it to be the model for your view layer (fragment, activity whatever). On the hindsight, it could be better to pick a name that is new but naming is really hard.


    总之: 查看型号 型号 在 MVC 场景中, C是 Activity 或 fragment , V是膨胀的 View , MViewModel .

    If i have to do some method calls related to View [like data query, network call and other business login related stuff ] where should i do it?


    ViewModel 以 LiveData 的形式获取数据,并且通过在给定生命周期的 View 中观察它来“激活”LiveData。
    网络调用也应该以相同的方式触发(如果您按照 LiveData 设计的方法进行操作)。
    理论上,如果你有一个登录调用,你也可以在 Controller 而不是模型中进行,所以你可以在 Fragment 中进行,即使有像 Jetpack 数据绑定(bind)这样的技巧可以让你从 View 中调用方法直接来自 XML 的模型。

    and if i have to use a Controller then how i connect View and Controller for device rotation and sharing controller between Fragment ?


    ViewModel 公开 LiveData并且可能还有 expose LiveEvent if you write the necessary code for that (unfortunately that is not provided by the Jetpack team , 也不是 Command 绑定(bind)),并且 View 或 Controller 可以在必要时直接在其上调用方法。 ViewModel 跨配置更改存储(而不是跨进程死亡,ofc),因此它不应该持有直接 View 引用。

    关于Android ViewModel 的职责是只为 View 保存数据或保存数据+ Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62099823/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com