gpt4 book ai didi

android - 将数据从一个 View 模型传递到另一个 android MVVM

转载 作者:行者123 更新时间:2023-12-04 21:28:52 24 4
gpt4 key购买 nike

我有一个与设计相关的问题要问你们。
所以,我一直关注Guide to App Architecture由 Google 使用 Kotlin、MVVM 和数据绑定(bind)构建我的应用程序。我正在使用 Google 规定的 Jetpack 组件(导航、实时数据等)。
问题是在开发过程中很多时候我需要将数据从一个 fragment 传输到另一个 fragment 。之前我曾经创建 fragment 的实例并添加复杂数据,然后移动到 fragment ,如下所示:

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 在同一文档中也提到了这一点。 >>

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 类。
我将尝试用一个很常见的场景来解释这个问题。
我有一个带有数据列表的 fragment 。列表中的每个项目对应一个用户。当我们点击一​​个项目时,它应该移动到用户详细信息屏幕,如果我们点击编辑按钮,我们应该移动到可以编辑详细信息的编辑屏幕。
             View User Frag
____ ____________
| | | |
List Frag | | | |
______ |____| | |
|______| /
|______|/ | |
|______|\ | | Huge Shared ViewModel class
|______| \
Edit User Frag | |
_____
| | | |
| |
|_____| |____________|
因此在这种情况下,ViewModel 将在这 3 个 Fragment 之间共享,因为 User 数据需要从列表类发送到 View 和编辑 Fragment,并且共享的 ViewModel 将具有所有三个 Fragment 的业务逻辑。
所以这对我来说似乎不合适,因为 ViewModel 在许多情况下会太复杂而无法像这样共享:
model = activity?.run {
ViewModelProviders.of(this)[SharedViewModel::class.java]
} ?: throw Exception("Invalid Activity")
将给出 View 模型的相同实例。
我需要知道我对这个 sharedviewmodel 的理解是否错误,如果是,请纠正我。如果我的理解是正确的,请告诉我在这种情况下如何更有效地管理 View 模型。

最佳答案

您可以拥有多个 ViewModelFragment 中,因此无需保留大量共享 ViewModel具有 3 个较小的所有逻辑。

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

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

关于android - 将数据从一个 View 模型传递到另一个 android MVVM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58573024/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com