繁体   English   中英

将 LiveData/ViewModel 与片段一起使用?

[英]Using LiveData/ViewModel with Fragments?

我将首先描述我想要实现的目标:

我有一个包含片段的活动。 现在,根据一些动作,活动将调用 FragmentManager 并替换相同类型的全新片段。

在我的片段 class 中,我得到了一个关联的 ViewModel。 在 onCreateView() 片段中,我订阅了 ViewModel 中的 LiveData 组件。

我在应用程序的整个生命周期中实例化了许多片段,但如上所述,在任何给定时刻只有一个片段处于活动状态。

我的问题是,我是否保证在调用getSupportFragmentManager().replace(id, new MyFrag())时,它将停止观察当前处于活动状态(即将被替换)的片段中 LiveData 的变化,而不是new MyFrag()new MyFrag()将是唯一的观察者吗?

我的第二个要求是我需要知道在调用replace()后何时附加片段我如何确保这一点? (注意我不想覆盖 onAttach() 我想在调用replace后知道这一点)

编辑:我将完全描述我的用例

我需要一次初始化数据并由我的 Fragment 观察。

让我解释:

我有一个父 Activity,它有一个加载一些数据的 ViewModel。 我的 Fragment 需要此数据,并且仅在第一次创建 Fragment 时才需要。 我所做的是在我的 Fragment 中设置观察者,它只是观察父活动的 LiveData 的变化。 因此,在我创建我的片段之后,我需要初始化该数据并且只需要一次,因此我调用 function 将这些数据加载到与我的父活动关联的 VM 中。 但是由于我的片段尚未附加,因此数据只是丢失了,因为我的观察者仅在片段不仅被创建而且被附加时才开始观察。

现在您可能会说,所以只需在 Fragments ViewModel 构造函数中初始化该数据,但我不能这样做,因为它依赖于只有父活动 VM 拥有的另一条关键数据。

我希望我很清楚,任何指导都会有所帮助,谢谢!

与其在onCreateView onCreate进行,并使用viewLifecycleOwner作为生命周期所有者。 这确保了当视图被销毁时,所有的观察者都被同时移除。

如果你使用this (片段)作为生命周期所有者,观察者只会在片段被销毁时被移除。 假设您使用后堆栈,替换片段不会立即销毁它。 但是视图肯定会被破坏。

至于第二个问题,我真的不是片段生命周期方面的专家,但你可以在这里使用onCreateonCreateView吗? 你是什么情况?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM