在片段视图模型之间传递数据
Pass data between fragment viewmodels
让我先声明一下,这更像是一个 "structural" 问题,我不是要任何人编写代码;我只是想弄清楚我应该如何构建我的应用程序。
我正在为我的应用程序使用 Android 的 DrawerLayout
/NavigationView
。这意味着 MainActivity
是我所有片段的宿主。
我目前有3个分片(实际上还有很多,但它们或多或少都和这三个分片一模一样,只是针对不同的数据集)
- ListFragment
- 细节片段
- EditFragment(用于添加和编辑)
在我的 ListFragment
上,我有(惊喜!)项目列表。这是 SharedViewModel
上的 LiveData
collection(与 MainActivity
的生命周期相关)。当一个项目被点击时,我通过接口监听器将事件传递给 MainActivity
。
MainActivity
然后加载 DetailFragment
。在同一调用中,我加载了 SharedViewModel
的实例(再次绑定到 MainActivity
)。我将 SharedViewModel.selectedItem
设置为点击的项目。然后,在 DetailFragment
的 onCreate
函数中,我通过 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 信息。原则上,它可以是其他东西。
让我先声明一下,这更像是一个 "structural" 问题,我不是要任何人编写代码;我只是想弄清楚我应该如何构建我的应用程序。
我正在为我的应用程序使用 Android 的 DrawerLayout
/NavigationView
。这意味着 MainActivity
是我所有片段的宿主。
我目前有3个分片(实际上还有很多,但它们或多或少都和这三个分片一模一样,只是针对不同的数据集)
- ListFragment
- 细节片段
- EditFragment(用于添加和编辑)
在我的 ListFragment
上,我有(惊喜!)项目列表。这是 SharedViewModel
上的 LiveData
collection(与 MainActivity
的生命周期相关)。当一个项目被点击时,我通过接口监听器将事件传递给 MainActivity
。
MainActivity
然后加载 DetailFragment
。在同一调用中,我加载了 SharedViewModel
的实例(再次绑定到 MainActivity
)。我将 SharedViewModel.selectedItem
设置为点击的项目。然后,在 DetailFragment
的 onCreate
函数中,我通过 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 信息。原则上,它可以是其他东西。