首页 > 解决方案 > 使用导航组件将视图模型限定为多个片段(不是活动)

问题描述

我正在使用导航组件,我希望在几个片段之间共享一个视图模型,但是当我离开片段时它们应该被清除(因此不将它们限制在活动范围内)我正在尝试将一个活动作为多个片段方法。我已经设法使用多个导航主机来实现这一点,并使用 getParentFragment 将片段范围限定为它,但这只会导致更多的问题,必须将片段包装在其他父片段中,失去后退按钮的无缝工作以及其他黑客让应该工作的东西很简单。有没有人知道如何实现这一目标?我想知道我可以使用 getViewModelStore 是否有任何东西,鉴于下面的图像,我想将视图模型的范围限定为 createCardFragment2 并在它之后的任何内容中使用它(addPredictions、editImageFragment 和其他我没有

顺便说一句,我不能只在 mainFragment 视图模型存储上调用 clear,因为这里还有其他不应该被清除的视图模型,我想我想要一种方法来告诉导航主机我知道的父片段应该是什么不是如果我从 mainFragment 或 cardPreviewFragment 导航,这将成为一件事或一种使视图模型新的方法

导航图

标签: androidandroid-fragmentsandroid-jetpackandroid-viewmodelandroid-jetpack-navigation

解决方案


这是 Alex H 接受的答案的具体示例。

在你的 build.gradle (app)

dependencies {
    def nav_version = "2.1.0"
    implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
}

视图模型示例

class MyViewModel : ViewModel() { 
    val name: MutableLiveData<String> = MutableLiveData()
}

在您的 FirstFlowFragment.kt 中定义

val myViewModel: MyViewModel by navGraphViewModels(R.id.your_nested_nav_id)
myViewModel.name.value = "Cool Name"

在您的 SecondFlowFragment.kt 中定义

val myViewModel: MyViewModel by navGraphViewModels(R.id.your_nested_nav_id)
val name = myViewModel.name.value.orEmpty()
Log.d("tag", "welcome $name!")

现在 ViewModel 被限定在这个嵌套片段中,当嵌套导航被销毁时共享状态也将被销毁,无需手动重置它们。


推荐阅读