将LiveData/ViewModel与片段一起使用



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

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

在我的fragment类中,我有一个关联的ViewModel。在片段onCreateView((中,我订阅了ViewModel中的LiveData组件。

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

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

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

编辑: 我要完整地描述我的用例

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

让我解释一下:

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

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

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

与其在onCreate中获取视图模型并订阅它,不如在onCreateView中进行,并使用viewLifecycleOwner作为生命周期所有者。这样可以确保当视图被破坏时,所有观察者都会同时被删除。

如果使用this(片段(作为生命周期所有者,则只有当片段被销毁时,才会删除观察者。假设您使用后堆栈,替换碎片不会立即破坏它。但这种观点肯定会被摧毁。

至于第二个问题,我真的不是碎片生命周期的专家,但你能在这里使用onCreateonCreateView吗?你的情况如何?

最新更新