问题很简单。问题在于使用ViewModels,LiveData和其他相关的Lifecycle感知拱方法。
我有一个带有NavDrawer的Activity,可以在其中切换片段。而且我也有一个案例,当两个碎片同时出现在屏幕上时-这将是主要的痛苦。
一个片段具有带嵌套Fragments的ViewPager(不要问为什么)。
另一个片段只是在用户执行某些操作时从第一个片段获取信息。仅通过共享 Activity View 模型即可实现。但是该应用程序本身具有许多业务逻辑,并且随着它的发展, View 模型变得越来越大。
我想问的是-不​​是收据或规则如何解决此问题,或者可能是如何通过修复项目的整个结构来克服此问题。我想征求建议,如何在android.arch.lifecycle样式中应用MVVM方法来挖掘用例。
我还没有看到更复杂的东西,只是在Fragments之间共享Activity ViewModel。但是常见的是,这不是治愈方法。
android -  fragment 的ViewModel而不是访问Activity ViewModel?-LMLPHP

您在这里可以看到的-实际上是一团糟。关键是所有人都共享ActivityViewModel。 FirstFragment的连接(聚合)意味着ViewPager中的FirstFragment正在启动ChildFragments,并且它们也使用相同的ActivityViewModel(杀死我)。因此,每个人都在使用一个共享的ViewModel。
我的建议是为每个图层添加一个ViewModel。因此,Activity/Fragments/ChildFragments具有自己的ViewModel。
但是,这里出现了什么-应该如何沟通?
可能的解决方案 :

  • 每个组件具有两个ViewModel。一个ViewModel将处理/委托(delegate)业务逻辑,另一个将进行通信。 每个组件两个 View 模型-不太好,是吗?
  • 具有旧的界面(,请不要!)
  • 其他解决方法-例如DB/SharedPrefs/Realm更改监听器和事件总线(我为此太老了:( )。
  • 您的解决方案在这里!

  • 我要说的是,以上所有都打破了许多设计原则,那我该怎么办?
    我该如何摆脱这个困惑局面?这里有什么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);
    

    10-08 02:20