【问题标题】:Passing data from one viewmodel to another android MVVM将数据从一个视图模型传递到另一个 android MVVM
【发布时间】:2019-10-26 17:19:46
【问题描述】:

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

所以,我一直关注 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
    }
    ....
}

使用navigation 在目的地之间传递数据应该类似于this 或使用同一文档中也提到的Shared View Model。 >>

一般来说,您应该强烈希望在目的地之间只传递最少量的数据。例如,您应该传递一个键来检索对象,而不是传递对象本身,因为所有保存状态的总空间在 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 的理解是否有误,如果有,请纠正我。如果我的理解是正确的,请告诉我在这种情况下如何更有效地管理视图模型。

【问题讨论】:

    标签: android mvvm android-jetpack android-jetpack-navigation android-architecture


    【解决方案1】:

    您可以在一个Fragment 中拥有多个ViewModels,因此无需保留一个巨大的共享ViewModel 以及三个较小的ViewModel 的所有逻辑。

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

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

    【讨论】:

    • 本地viewmodel需要访问共享viewmodel怎么办?
    • 虽然这并不符合所有标准
    • @Mark 你不能通过视图(片段或活动)做到这一点吗?
    • @Mircea Nistor 以及 localViewModel 是否需要访问共享 viewModel 中的对象 X ?在我看来还是这个程序有问题?
    • 视图可以访问这两者。因此,您可以将其传递给您想要的任何 VM @aeroxr1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多