将数据从一个视图模型传递到另一个 android MVVM

Passing data from one viewmodel to another android MVVM

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

因此,我一直在关注 Google Guide to App Architecture 使用 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
    }
    ....
}

With navigation passing data between destination is supposed to be like this or to use Shared View Model 这也在同一文档中提到。 >>

In general, you should strongly prefer passing only the minimal amount of data between destinations. For example, you should pass a key to retrieve an object rather than passing the object itself, as the total space for all saved states is limited on Android. If you need to pass large amounts of data, consider using a ViewModel as described in Share data between fragments.

有效。

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

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

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

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

所以在这种情况下,ViewModel 将在这 3 个片段之间共享,因为用户数据需要从列表 class 发送到视图和编辑片段,共享的 ViewModel 将具有业务所有三个片段的逻辑。

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

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

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

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

您可以在一个 Fragment 中包含多个 ViewModel,因此无需保留一个包含 3 个较小的所有逻辑的巨大共享 ViewModel

您可以创建一个仅关心实际公共数据的额外共享 ViewModel,并将您的 3 个独立片段特定 ViewModel 分开。

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