首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ViewModel用于片段访问活动ViewModel?

ViewModel用于片段访问活动ViewModel?
EN

Stack Overflow用户
提问于 2017-09-17 20:51:13
回答 4查看 18.6K关注 0票数 29

这个问题很直接。问题是在使用ViewModels、LiveData和其他相关的生命周期感知arch方法时。

我使用NavDrawer进行了一个活动,它可以切换内部的片段。

我也有一个例子,当两个片段同时出现在屏幕上时--这将是主要的痛苦。一个片段有一个带有嵌套ViewPager的Fragments(不问为什么是)。另一个片段只是在用户执行某些操作时从第一个片段获取信息。这是通过共享活动视图模型来实现的。但是这个应用本身有很多业务逻辑,而且随着它的进一步发展,视图模型变得越来越大。

我想问的是-而不是收据或规则如何解决这个问题,或者也许如何通过修复项目的整个结构来克服这个问题。我想征求一些建议,如何将android.arch.lifecycle风格中的MVVM方法应用于我的用例。

我还没有看到比在片段间共享活动ViewModel更复杂的东西。但很普通,这不是治愈方法。

你在这里能看到的其实是一团糟。关键是所有的人都在共享ActivityViewModel。来自FirstFragment的连接(聚合)意味着ViewPagerFirstFragment中启动ChildFragments,它们也使用相同的ActivityViewModel(杀死我)。因此,每个人都在使用一个共享的ViewModel。

我的建议是为每个层添加一个ViewModel。因此,活动/片段/儿童框架有他们自己的ViewModels。但这里出现了什么-,我们应该如何沟通,然后

可能的解决办法:

  • 每个组件有两个ViewModels。一个ViewModel将处理/委托业务逻辑,另一个将进行通信。每个组件两个视图模型-不太好,是吗?
  • 有旧方式的接口(请不要!)
  • 其他解决方案--如DB/SharedPrefs/领域更改监听器和事件总线(,我太老了,不宜这样做:( )。
  • 你的解决方案在这里!

我要说的是,所有这些都破坏了许多设计原则,那么我该怎么办呢?我该怎么摆脱这混乱的局面?这里有任何Uncle Bob或其他superhero来帮助您吗?

P.S. --嗯,创建UML或其他图表并不是我的强项。很抱歉。

P.P.S. -我知道谷歌 样本

EN

回答 4

Stack Overflow用户

发布于 2018-10-10 04:52:24

我建议您可以为整个用例处理两个ViewModel

制作一个ViewModel

假设MyActivityViewModel处理与活动级别相关的所有逻辑。因此,如果任何片段逻辑与您的活动直接相关,那么共享您的ViewModel如下:

代码语言:javascript
复制
ViewModelProviders.of(getActivity()).get(MyActivityViewModel.class); // Like this in fragment.

&

代码语言:javascript
复制
ViewModelProviders.of(this).get(MyActivityViewModel.class); // Like this in activity.

这将在您的ViewModel活动片段之间共享公共。

如果您必须在ViewModel之间共享逻辑,那么在您的情况下,另一个FirstFragment将用于ChildFragment

在这里,您可以共享ViewModel,比方说FragmentViewModel,如下所示:

代码语言:javascript
复制
ViewModelProviders.of(this).get(FragmentViewModel.class); // Like this in FirstFragment which is having view pager.

&

代码语言:javascript
复制
ViewModelProviders.of(getParentFragment()).get(FragmentViewModel.class); // Like this in View pager fragments, getParentFragment() is First fragment in our case.

尽管如此,我们仍然可以在来自MyActivityViewModel的子片段中使用活动级别的FirstFragment,例如:

代码语言:javascript
复制
ViewModelProviders.of(getActivity()).get(MyActivityViewModel.class);
票数 16
EN

Stack Overflow用户

发布于 2018-01-24 15:36:26

首先,一个单一的ViewModel视图拥有多个并没有什么害处。

我会想到我的ViewModel是什么样的数据获取和操作,并在某种程度上分组,这似乎很自然。

对于您的情况,如果片段和活动的逻辑非常相似,我认为您可以使用单个ViewModel,但我会避免这种情况。

我要做的是将活动的ViewModel's.分解成更小的部分,并在ViewModel中重用适当的ViewModel,这样我就不会有一个ViewModel ViewModel,也不会在不同的Fragments中使用大致相同的代码。

票数 7
EN

Stack Overflow用户

发布于 2020-08-21 07:31:01

这是Jeel Vankhede给出的答案的更新版本。而且Kotlin的实现也一样。

由于现在不推荐ViewModelProviders,所以我们必须使用ViewModelProvider。

下面是您如何在活动中这样做的:

代码语言:javascript
复制
ViewModelProvider(this).get(MyActivityViewModel::class.java)

下面是您如何分段完成的工作:

代码语言:javascript
复制
ViewModelProvider(requireActivity()).get(MyActivityViewModel::class.java)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46268768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档