将数据从一个ViewModel传递到另一个Android MVVM

fre*_*yle 5 android mvvm android-architecture android-jetpack android-jetpack-navigation

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

因此,我一直在遵循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
    }
    ....
}
Run Code Online (Sandbox Code Playgroud)

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

通常,强烈建议您仅在目标之间传递最少的数据量。例如,您应该传递键来检索对象,而不要传递对象本身,因为所有保存状态的总空间在Android上受到限制。如果您需要传递大量数据,请考虑使用在片段之间共享数据中所述的ViewModel。

这可行。

我的问题是,使用体系结构的主要原因之一是关注点分离。这样我们就可以编写干净且可维护的代码。根据我的理解,sharedviewmodel的这种用法无法达到目的,因为这会导致大型ViewModel类。

我将尝试使用非常常见的情况来解释问题。

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

             View User Frag
             ____                 ____________
            |    |               |            |
 List Frag  |    |               |            |
 ______     |____|               |            |
|______| /
|______|/                        |            |
|______|\                        |            | Huge Shared ViewModel class
|______| \
            Edit User Frag       |            |
            _____
           |     |               |            |
           |     |
           |_____|               |____________|
Run Code Online (Sandbox Code Playgroud)

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

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

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

将提供相同的viewmodel实例。

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

Mir*_*tor 5

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

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

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

  • 如果本地视图模型需要访问共享视图模型怎么办? (6认同)