android - nav_graph 中两个 fragment 之间的共享 View 模型

标签 android android-studio android-viewmodel android-architecture-navigation android-navigation

我有一个应用程序有一个 Activity ,在 nav_graph 中有大约 29 个 fragment ,其中两个 fragment 用于身份验证,我需要使用 shared 在这两个 fragment 之间共享数据查看模型,但不包含其他 fragment 。

因此,我创建了我的 ViewModel 并使用 viewModels() 在两个 fragment 中实例化了它,它是 fragment-ktx 库的一部分.

private val viewModel: AuthViewModel by viewModels()

但是,一旦我使用 findNavController().navigate() 导航到第二个 fragment ,我就会丢失 AuthViewModel

中的所有数据

AuthViewModel.kt

class AuthViewModel @ViewModelInject constructor(
    private val authRepository: AuthRepository
) : BaseViewModel()

我在这里还缺少任何其他步骤吗?

编辑

我正在从 onViewCreated 方法访问数据

最佳答案

当您通过 viewmodels() 创建 View 模型时,您会获得对当前 Fragment 范围内的 ViewModel 的引用。

因此,在您的情况下,您将在两个 fragment 中使用 private val viewModel: AuthViewModel by viewModels(),这为您提供了绑定(bind)到每个 fragment 的两个不同的 View 模型实例。

Shared Viewmodel 的概念需要像 ActivityNavGraph 这样的 Shared Scope。

  1. 使用 Activity

改变

private val viewModel: AuthViewModel by viewModels()

private val viewModel: AuthViewModel by activityViewModels()
  1. 使用导航图

创建另一个导航图,其中有两个用于身份验证的 fragment 。

<navigation android:id="@+id/authenticationNavGraph" 
        app:startDestination="@id/chooseRecipient">
        <fragment
            android:id="@+id/authentication1Fragment"
            android:name="com.example.AuthFragment1"
            android:label="Fragment 1">
        </fragment>
        <fragment
            android:id="@+id/authentication2Fragment"
            android:name="com.example.AuthFragment2"
            android:label="Fragment 2" />
</navigation>

现在如果你想使用相同的 View 模型 AuthViewModel 然后你可以创建一个 View 模型使用:

private val viewModel: AuthViewModel by navGraphViewModels(R.id.authenticationNavGraph)

关于android - nav_graph 中两个 fragment 之间的共享 View 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64385335/

相关文章:

Android 上下文菜单(类似于音乐应用程序)

java - 无法解析方法'show(android.support.v4.app.FragmentManager, java.lang.String)

android - "Create New Project"按钮显示非Android项目创建屏幕

java - 注册观察者与设置处理程序

android - 方向改变使事物无效

android - ScrollView 触摸处理中的 Horizo​​ntalScrollView

android-layout - 如何用空结束标记 (/>) 批量替换空正文标记 (</TextView>)

android - 如何将 Android 字符串资源导入/导出到 Excel 以进行本地化?

android - viewModelScope 未解析的引用

android - 奇怪的 AndroidViewModel LiveData 观察者行为