使用导航组件的父片段范围内的共享ViewModel

问题描述 投票:1回答:1

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

Fragments hierarchy

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

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

我已经尝试过的方法:在子viewModel中,我使用以下代码:

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

在父viewModel中,我使用此:

    val viewModel by viewModels<ParentViewModel>()

我还尝试使用Koin sharedViewModel注入具有片段范围的viewModel:

val viewModel by sharedViewModel<ParentViewModel>(from = { parentFragment!! })

也没有运气。

是否可能是导航库中的错误?

我正在尝试通过导航组件在父片段及其子代中使用相同的ViewModel实例。层次结构如下:具有NavigationHost的单个Activity。该主机有3个...

android android-fragments viewmodel android-jetpack android-jetpack-navigation
1个回答
1
投票

NavHostFragment本身就是片段,因此您的结构实际上是

© www.soinside.com 2019 - 2024. All rights reserved.