问题很简单。问题在于使用ViewModels,LiveData和其他相关的Lifecycle感知拱方法。
我有一个带有NavDrawer的Activity,可以在其中切换片段。而且我也有一个案例,当两个碎片同时出现在屏幕上时-这将是主要的痛苦。
一个片段具有带嵌套Fragments
的ViewPager(不要问为什么)。
另一个片段只是在用户执行某些操作时从第一个片段获取信息。仅通过共享 Activity View 模型即可实现。但是该应用程序本身具有许多业务逻辑,并且随着它的发展, View 模型变得越来越大。
我想问的是-不是收据或规则如何解决此问题,或者可能是如何通过修复项目的整个结构来克服此问题。我想征求建议,如何在android.arch.lifecycle样式中应用MVVM方法来挖掘用例。
我还没有看到更复杂的东西,只是在Fragments之间共享Activity ViewModel。但是常见的是,这不是治愈方法。
您在这里可以看到的-实际上是一团糟。关键是所有人都共享ActivityViewModel
。 FirstFragment的连接(聚合)意味着ViewPager
中的FirstFragment
正在启动ChildFragments
,并且它们也使用相同的ActivityViewModel
(杀死我)。因此,每个人都在使用一个共享的ViewModel。
我的建议是为每个图层添加一个ViewModel。因此,Activity/Fragments/ChildFragments具有自己的ViewModel。
但是,这里出现了什么-和应该如何沟通?
可能的解决方案 :
我要说的是,以上所有都打破了许多设计原则,那我该怎么办?
我该如何摆脱这个困惑局面?这里有什么
Uncle Bob
或其他superhero
可以帮助您吗?P.S. -好吧,创建UML或其他图表不是我的强项。抱歉
P.P.S. -我知道google samples。
最佳答案
我会建议您可以做的是在整个用例中处理两个ViewModel
。
制作一个ViewModel
假设 MyActivityViewModel
可以处理与 Activity 级别相关的所有逻辑。因此,如果任何片段逻辑与您的 Activity 直接相关,请按以下方式共享ViewModel
:
ViewModelProviders.of(getActivity()).get(MyActivityViewModel.class); // Like this in fragment.
和
ViewModelProviders.of(this).get(MyActivityViewModel.class); // Like this in activity.
这将在您的 Activity 和片段之间共享通用的
ViewModel
。如果您必须在
ViewModel
之间共享逻辑,则另一个FirstFragment
将适合您的情况:在这里您可以共享
ChildFragment
,让我们像下面这样说ViewModel
: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.
虽然,我们仍然可以在FirstFragment的子片段中使用 Activity 级别
FragmentViewModel
,例如:ViewModelProviders.of(getActivity()).get(MyActivityViewModel.class);