gpt4 book ai didi

android - 使用导航组件在父 fragment 范围内共享 ViewModel

转载 作者:行者123 更新时间:2023-12-03 20:26:26 27 4
gpt4 key购买 nike

我正在尝试使用导航组件在父 fragment 及其子 fragment 中使用相同的 ViewModel 实例。层次结构如下: 具有navigationHost 的单个Activity。该主机有 3 个子 fragment ,A、B 和 C。最后一个 fragment 也有带有 2 个 fragment 的 navigationHost:X 和 Y。下图说明了层次结构。

Fragments hierarchy

预期的:
我想与 fragment X 和 Y 共享 fragment C ViewModel 的相同实例。

当前的:
Fragment C 的 ViewModel 被初始化两次:一次是在 Fragment C 初始化时,第二次是在 Fragment X 初始化时。 fragment X 被设置为 fragment C 导航图中的默认目的地。当我将默认目标更改为 Y 时,ViewModel 在 C 和 Y 中初始化。

我已经尝试过的:
在 subview 模型中,我使用这个:

        val viewModel: ParentViewModel =
ViewModelProvider(findNavController().getViewModelStoreOwner(R.id.parent_graph)).get(
ParentViewModel::class.java
)

在父 viewModel 我使用这个:
    val viewModel by viewModels<ParentViewModel>()

我还尝试使用具有 fragment 范围的 Koin sharedViewModel 注入(inject) viewModel:
val viewModel by sharedViewModel<ParentViewModel>(from = { parentFragment!! })

也没有运气。

有可能还是导航库中的错误?

最佳答案

一个 NavHostFragment本身就是一个 fragment ,所以你的结构实际上是

Fragment C -> NavHostFragment -> Fragment X
-> Fragment Y

parentFragment你从 Fragment X 得到的是 不是 fragment C - 它是 NavHostFragment您在两者之间添加。

因此,如果您想获得 ViewModel从 fragment C,您需要使用 requireParentFragment().requireParentFragment() - 你的 NavHostFragment 的 parent 是 fragment C。

关于android - 使用导航组件在父 fragment 范围内共享 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60356505/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com