这个问题很直接。问题是在使用ViewModels、LiveData和其他相关的生命周期感知arch方法时。
我使用NavDrawer进行了一个活动,它可以切换内部的片段。
我也有一个例子,当两个片段同时出现在屏幕上时--这将是主要的痛苦。一个片段有一个带有嵌套ViewPager的Fragments(不问为什么是)。另一个片段只是在用户执行某些操作时从第一个片段获取信息。这是通过共享活动视图模型来实现的。但是这个应用本身有很多业务逻辑,而且随着它的进一步发展,视图模型变得越来越大。
我想问的是-而不是收据或规则如何解决这个问题,或者也许如何通过修复项目的整个结构来克服这个问题。我想征求一些建议,如何将android.arch.lifecycle风格中的MVVM方法应用于我的用例。
我还没有看到比在片段间共享活动ViewModel更复杂的东西。但很普通,这不是治愈方法。

你在这里能看到的其实是一团糟。关键是所有的人都在共享ActivityViewModel。来自FirstFragment的连接(聚合)意味着ViewPager在FirstFragment中启动ChildFragments,它们也使用相同的ActivityViewModel(杀死我)。因此,每个人都在使用一个共享的ViewModel。
我的建议是为每个层添加一个ViewModel。因此,活动/片段/儿童框架有他们自己的ViewModels。但这里出现了什么-,我们应该如何沟通,然后?
可能的解决办法:
我要说的是,所有这些都破坏了许多设计原则,那么我该怎么办呢?我该怎么摆脱这混乱的局面?这里有任何Uncle Bob或其他superhero来帮助您吗?
P.S. --嗯,创建UML或其他图表并不是我的强项。很抱歉。
发布于 2018-10-10 04:52:24
我建议您可以为整个用例处理两个ViewModel。
制作一个ViewModel
假设MyActivityViewModel处理与活动级别相关的所有逻辑。因此,如果任何片段逻辑与您的活动直接相关,那么共享您的ViewModel如下:
ViewModelProviders.of(getActivity()).get(MyActivityViewModel.class); // Like this in fragment.&
ViewModelProviders.of(this).get(MyActivityViewModel.class); // Like this in activity.这将在您的ViewModel活动和片段之间共享公共。
如果您必须在ViewModel之间共享逻辑,那么在您的情况下,另一个FirstFragment将用于ChildFragment:
在这里,您可以共享ViewModel,比方说FragmentViewModel,如下所示:
ViewModelProviders.of(this).get(FragmentViewModel.class); // Like this in FirstFragment which is having view pager.&
ViewModelProviders.of(getParentFragment()).get(FragmentViewModel.class); // Like this in View pager fragments, getParentFragment() is First fragment in our case.尽管如此,我们仍然可以在来自MyActivityViewModel的子片段中使用活动级别的FirstFragment,例如:
ViewModelProviders.of(getActivity()).get(MyActivityViewModel.class);发布于 2018-01-24 15:36:26
首先,一个单一的ViewModel视图拥有多个并没有什么害处。
我会想到我的ViewModel是什么样的数据获取和操作,并在某种程度上分组,这似乎很自然。
对于您的情况,如果片段和活动的逻辑非常相似,我认为您可以使用单个ViewModel,但我会避免这种情况。
我要做的是将活动的ViewModel's.分解成更小的部分,并在ViewModel中重用适当的ViewModel,这样我就不会有一个ViewModel ViewModel,也不会在不同的Fragments中使用大致相同的代码。
发布于 2020-08-21 07:31:01
这是Jeel Vankhede给出的答案的更新版本。而且Kotlin的实现也一样。
由于现在不推荐ViewModelProviders,所以我们必须使用ViewModelProvider。
下面是您如何在活动中这样做的:
ViewModelProvider(this).get(MyActivityViewModel::class.java)下面是您如何分段完成的工作:
ViewModelProvider(requireActivity()).get(MyActivityViewModel::class.java)https://stackoverflow.com/questions/46268768
复制相似问题