nav_graph 中两个片段之间的共享视图模型

Shared View Model between two fragments in the nav_graph

我有一个应用程序,其中有一个 activity 和 nav_graph 中的大约 29 个片段,其中两个片段用于身份验证,我需要使用 [= 在这两个片段之间共享数据=14=] 但与其他片段无关。

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

private val viewModel: AuthViewModel by viewModels()

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

中的所有数据

AuthViewModel.kt

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

这里还有什么我遗漏的步骤吗?

编辑

我正在通过 onViewCreated 方法访问数据

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

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

共享视图模型的概念需要像 ActivityNavGraph 这样的共享范围。

  1. 使用Activity

改变一下

private val viewModel: AuthViewModel by viewModels()

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

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

<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>

现在如果你想使用相同的视图模型 AuthViewModel 那么你可以使用以下方法创建视图模型:

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