android - 使用导航组件将 View 模型限定为多个 fragment (不是 Activity )

标签 android android-fragments android-jetpack android-viewmodel android-jetpack-navigation

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

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

nav graph

最佳答案

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

在你的 build.gradle (app)

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

View 模型示例
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 被限定在这个嵌套 fragment 中,当嵌套导航被销毁时共享状态也将被销毁,无需手动重置它们。

关于android - 使用导航组件将 View 模型限定为多个 fragment (不是 Activity ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56505455/

相关文章:

android - 如何避免 MediatorLiveData 的所有源调用同一函数?

android - 牛轧糖套接字关闭时无法连接蓝牙

android - Parse.com 检索整个数组 android

java - 如何将 Google Map API v2 包含到 fragment 中?

android - 由 : android. view.InflateException: Binary XML file line #11: Error inflating class fragment 引起

android - 如何使用导航组件向变化的 fragment 添加动画?

android - 自定义实时模板中的 groovy 脚本错误

android - 使用 Phonegap 在本地存储数据库的最佳方式

android - 如何处理 Fragment 中的 onBackPressed()?

android - 用于文本选择的 float 工具栏 Jetpack Compose