Android: 一个 ViewModel 可以用于多个 Fragments 吗?

Android: One ViewModel for multiple Fragments possible?

我有一个关于 Android 的应用架构的一般性问题。我正在实现一个应用程序(在 Java 中),它有一个 activity 和 20 个片段(相似但不相同)。到目前为止,我在片段中实现了所有内容(UI、逻辑、数据库查询)。现在我正在考虑使用 ViewModel,但我不确定是否值得付出努力。所以我的问题是我的 20 个片段中的每一个是否都应该有一个自己的 ViewModel,或者我是否可以为所有 20 个片段实现一个 ViewModel?为所有 Fragment 类 实现一个 ViewModel 会大大增加工作量,所以我想知道是否可以为所有 Fragment 只有一个 ViewModel?

每个片段有一个视图模型。这样每个视图模型负责做与一个片段相关的事情,因此测试也更容易。

事实上,您可以为单个片段设置多个视图模型,为您做不同的事情。

将所有内容都保留在一个视图模型中会使测试变得更加困难,而且您必须保留所有 20 个片段的视图模型可能会影响 activity。

技术上可以为所有 Fragment 设置一个 ViewModel

但是,由于这个 ViewModel 必须管理许多非常不同的用例,所以它会类似于 god object。 20个Fragments,代码行会很多...

切换到 MVVM 通常是值得的,因为长期 运行 应用程序更易于测试和维护。

在您的应用程序中使用 BaseViewModel 可能是个好主意:ViewModel class 处理在所有用例中都相似的事情,比如让 Fragment 知道它应该显示加载指示器或错误消息。 “正常”ViewModel 可以扩展 BaseViewModel 并专注于他们的用例。

在某些情况下共享 ViewModel 是有意义的,例如,当 Fragment 显示一个包含一些 EditText 的对话框时,或者当一个人的工作流程包含一系列在小型设备上需要 3-4 Fragment 秒,而在较大的设备上,一两个 Fragment 秒就足够了。

以防万一,这是我最喜欢的 MVVM 应用架构起点:Guide to app architecture

Now I am considering to use a ViewModel but I am not sure whether it is worth the effor

如果你想对以后的发展有好处,这绝对是值得的。

So my question is whether each of my 20 Fragments should have an own ViewModel or whether I can just implement one ViewModel for all the 20 Fragments?

每个片段都应该有自己的 ViewModel,我不喜欢共享 ViewModel。我开发了很多应用程序,我逐渐意识到我应该尽量避免紧耦合。因为你每次开发都会有很多变化,当你编辑或添加或删除它时会让你编辑很多,因为链接太紧了。最好将它们拆开,并且仍然能够 运行 正常使用,并且在需要时能够像拼图一样重新组装它们。

Implementing a ViewModel for all Fragment classes would drastically increase the effort, so I would like to know if it is possible to have only one ViewModel for all Fragments?

只要你想就可以,在编程中没有什么是不可能的。但如果你这样做,你不应该因为它只会让你的代码更复杂。

您可以在此处阅读有关该模型的更多信息。

https://developer.android.com/jetpack/guide#overview

你可以完成这个 link Shareable ViewModel

这在 Kotlin 中通过使用扩展函数非常简单,但是在 Java 中,我们需要创建一个函数来创建 ViewModel 并根据 activity/fragment 的生命周期处理它们的范围。