7

我有一个与设计相关的问题要问你们。

因此,我一直在按照Google 的应用程序架构指南使用 Kotlin、MVVM 和数据绑定来构建我的应用程序。我正在使用 Google 规定的 Jetpack 组件(导航、实时数据等)。

问题是在开发过程中很多时候我需要将数据从一个片段传输到另一个片段。之前我曾经创建片段的实例并添加复杂数据,然后移动到片段,如下所示:

class Frag1: Fragment(){

    ...
    fun openFrag2(){
        val frg2 = frag2.newInstance(complexDataObj)
        childFragmentManager.addFragment(frg2,TAG)
    }
}

class Frag2: Fragment(){
    var cd: ComplexDataClass = null
    companion object{
    fun newInstance(complexData: ComplexDataClass): Fragment{
        val frag = ActivityFragment()
        frag.cd = complexData
        return frag
    }
    ....
}

导航在目的地之间传递数据应该是这样的或者使用同一文档中也提到的共享视图模型。>>

一般来说,您应该强烈希望在目的地之间只传递最少量的数据。例如,您应该传递一个键来检索对象,而不是传递对象本身,因为所有保存状态的总空间在 Android 上是有限的。如果您需要传递大量数据,请考虑使用在片段之间共享数据中描述的 ViewModel。

这行得通。

问题是使用架构的主要原因之一是关注点分离;这样我们就可以编写干净且可维护的代码。sharedviewmodel 的这种使用违背了这个目的(根据我的理解),因为这会导致大型 ViewModel 类。

我将尝试用一个很常见的场景来解释这个问题。

我有一个带有数据列表的片段。列表中的每个项目对应一个用户。当我们点击一​​个项目时,它应该移动到用户详细信息屏幕,如果我们点击编辑按钮,我们应该移动到可以编辑详细信息的编辑屏幕。

             View User Frag
             ____                 ____________
            |    |               |            |
 List Frag  |    |               |            |
 ______     |____|               |            |
|______| /
|______|/                        |            |
|______|\                        |            | Huge Shared ViewModel class
|______| \
            Edit User Frag       |            |
            _____
           |     |               |            |
           |     |
           |_____|               |____________|

因此在这种情况下,ViewModel 将在这 3 个 Fragment 之间共享,因为 User 数据需要从列表类发送到视图和编辑 Fragment,并且共享的 ViewModel 将具有所有三个 Fragment 的业务逻辑。

所以这对我来说似乎不合适,因为 ViewModel 在许多情况下会太复杂而无法像这样共享:

model = activity?.run {
        ViewModelProviders.of(this)[SharedViewModel::class.java]
    } ?: throw Exception("Invalid Activity")

将给出视图模型的相同实例。

我需要知道我对这个 sharedviewmodel 的理解是否错误,如果是,请纠正我。如果我的理解是正确的,请告诉我在这种情况下如何更有效地管理视图模型。

4

1 回答 1

4

您可以在 a 中有多个ViewModels Fragment,因此无需ViewModel与 3 个较小逻辑的所有逻辑保持大量共享。

ViewModel您可以创建一个只关心实际公共数据的额外共享,并保持您的 3 个单独的片段特定ViewModels 分开。

sharedModel = activity?.run {
        ViewModelProviders.of(this)[SharedViewModel::class.java]
    } ?: throw Exception("Invalid Activity")
localViewModel = ViewModelProviders.of(this).get(LocalViewModel::class.java)
于 2019-11-02T21:33:33.500 回答