代码之家  ›  专栏  ›  技术社区  ›  RareNCool

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

  •  5
  • RareNCool  · 技术社区  · 7 年前

    让我先说一下,这更像是一个“结构性”问题,我并没有要求任何人编写代码;我只是想弄清楚我应该如何构建我的应用程序。

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

    我目前有三个片段(实际上要多得多,但它们或多或少都与这三个片段完全相同,只是针对不同的数据集)。

    • 列表片段
    • DetailFragment
    • EditFragment(用于添加和编辑)

    在我的 ListFragment 我有(惊喜!)项目列表。这是一个 LiveData 上的集合 SharedViewModel (与 主要活动 的生命周期)。点击项目时,我将事件传递给 主要活动 通过接口侦听器。

    主要活动 然后加载 DetailFragment . 在同一调用中,我加载 SharedViewModel (再次绑定到 主要活动 ). 我设置 SharedViewModel.selectedItem 为抽头项目。然后,在 DetailFragment onCreate 函数,我通过 ViewModelProviders.of(activity).get(SharedViewModel::class.java).selectedItem .

    DetailFragment ,有一个编辑按钮。这或多或少会经历上述相同的例程,但加载 EditFragment 相反保存编辑/添加的项目时,我在中添加/替换该项目 SharedViewModel 的集合通过 主要活动 的接口侦听器。

    显然,这不是最佳的,原因有几个。首先,这意味着我至少有五大组数据 主要活动 的生命周期(本质上是应用程序的整个生命周期)。而且 主要活动 随着我不得不添加越来越多的函数来处理事件,这种增长变得难以控制。

    什么是我 希望 例如,要做的是在 ListFragmentViewModel 这与 列表片段 的生命周期 . 我在上选择的项目 DetailFragmentViewModel ,我的编辑项目位于 EditFragmentViewModel

    我的问题是,在这种情况下,我不确定如何正确地传递数据。例如,假设我在 编辑片段 . 我该怎么做 ListFragmentViewModel 的项目集合? 列表片段 位于后堆栈中,因此其viewmodel挂起,在导航回时不会重新加载数据,因为它仍然具有以前的集合。这很有道理,可能就是 应该 be(毕竟,谁想在转到时等待加载所有数据 DetailFragment 然后返回到 列表片段 ?), 但这意味着我没有收到我的新产品。

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

    我甚至不太确定我应该往哪个方向走。有经验的人能帮我吗?

    1 回复  |  直到 7 年前
        1
  •  4
  •   CommonsWare    7 年前

    假设我在EditFragment中添加了一个新项。如何将其纳入ListFragmentViewModel的项目集合?

    EditFragment 告诉您的项目存储库,“哟!这里有一个新项目!”。项目存储库安排更新备份存储,并向相关方发送事件,通知数据更改(例如,在RxJava上发送事件 PublishSubject ). 这个 ListFragmentViewModel 倾听这些事件并做出相应的反应。

    ListFragment位于后堆栈中,因此它的viewmodel挂起,在导航回时不会重新加载数据,因为它仍然具有以前的集合

    它应该从您的项目存储库中了解数据更改,并尽一切可能反映数据更改。这可以简单地从数据更改事件中获取数据并更新其内存内容。这可能是从后备存储重新请求信息。原则上,它可能是其他东西。