在片段视图模型之间传递数据

Pass data between fragment viewmodels

让我先声明一下,这更像是一个 "structural" 问题,我不是要任何人编写代码;我只是想弄清楚我应该如何构建我的应用程序。

我正在为我的应用程序使用 Android 的 DrawerLayout/NavigationView。这意味着 MainActivity 是我所有片段的宿主。

我目前有3个分片(实际上还有很多,但它们或多或少都和这三个分片一模一样,只是针对不同的数据集)

在我的 ListFragment 上,我有(惊喜!)项目列表。这是 SharedViewModel 上的 LiveData collection(与 MainActivity 的生命周期相关)。当一个项目被点击时,我通过接口监听器将事件传递给 MainActivity

MainActivity 然后加载 DetailFragment。在同一调用中,我加载了 SharedViewModel 的实例(再次绑定到 MainActivity)。我将 SharedViewModel.selectedItem 设置为点击的项目。然后,在 DetailFragmentonCreate 函数中,我通过 ViewModelProviders.of(activity).get(SharedViewModel::class.java).selectedItem.

获取所选项目

DetailFragment 上,有一个编辑按钮。这或多或少地经历了与上述相同的例程,但改为加载 EditFragment 。当 edited/added 项目被保存时,我 add/replace 通过 MainActivity 的接口侦听器 SharedViewModel 的 collection 中的项目。

显然,出于多种原因,这并不是最佳选择。首先,这意味着我在 MainActivity 的生命周期(本质上是应用程序的整个生命周期)中至少有五组大型数据。此外,MainActivity 变得无法控制,因为我必须添加越来越多的函数来处理事件。

想要 做的是,例如,我的 ListFragmentViewModel 上的项目列表与 ListFragment的生命周期。我在 DetailFragmentViewModel 上选择的项目,我在 EditFragmentViewModel 上编辑的项目,等等

我的问题是我不确定在这种情况下如何正确传递数据。例如,假设我在 EditFragment 中添加了一个新项目。我如何将它添加到 ListFragmentViewModel 的 collection 项中? ListFragment 在 back-stack 中,因此它的视图模型会停留并且在导航回时不会重新加载数据,因为它仍然具有之前的 collection。这是有道理的,并且可能是 应该 的样子(毕竟,谁愿意等待所有数据加载到 DetailFragment 并返回到 ListFragment?), 但这意味着我没有在 collection.

中得到我的新项目

这只是一个例子,但我 运行 遇到了很多类似的问题(例如,将所选项目传递给 DetailFragmentViewModel。)

我什至不确定我应该去哪里。有经验的人可以帮我吗?

let's say I add a new item in EditFragment. How do I get that into ListFragmentViewModel's collection of items?

EditFragment 告诉您的项目存储库,"yo! here's a new item!"。项目存储库安排更新您的后备存储,并向感兴趣的各方发出一个事件,通知数据更改(例如,在 RxJava PublishSubject 上发出一个事件)。 ListFragmentViewModel 监听这些事件并做出相应的反应。

ListFragment is in the back-stack, so its viewmodel hangs around and doesn't reload the data when it's navigated back to, since it still has the collection from before

它应该从您的项目存储库中找出数据更改,并采取任何有意义的措施来反映该数据更改。这可能只是从 data-change 事件中获取数据并更新其 in-memory 内容。这可能是来自后备存储的 re-requesting 信息。原则上,它可以是其他东西。