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

Ham*_*ruf 2 android android-studio android-navigation android-viewmodel android-architecture-navigation

我有一个应用程序,其中有一个活动和大约 29 个片段nav_graph,其中两个片段用于身份验证,我需要使用 a 在这两个片段之间共享数据,shared view model但不与其他片段共享数据。

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

private val viewModel: AuthViewModel by viewModels()
Run Code Online (Sandbox Code Playgroud)

但是,一旦我使用导航到第二个片段,findNavController().navigate()我就会丢失其中的所有数据AuthViewModel

AuthViewModel.kt

class AuthViewModel @ViewModelInject constructor(
    private val authRepository: AuthRepository
) : BaseViewModel()
Run Code Online (Sandbox Code Playgroud)

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

编辑

onViewCreated我正在从该方法访问数据

Raj*_*shi 14

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

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

共享视图模型的概念需要一个共享范围,例如ActivityNavGraph

  1. 使用活动

只是改变

private val viewModel: AuthViewModel by viewModels()
Run Code Online (Sandbox Code Playgroud)

private val viewModel: AuthViewModel by activityViewModels()
Run Code Online (Sandbox Code Playgroud)
  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>
Run Code Online (Sandbox Code Playgroud)

现在,如果您想使用相同的视图模型AuthViewModel,那么您可以使用以下命令创建视图模型:

private val viewModel: AuthViewModel by navGraphViewModels(R.id.authenticationNavGraph)
Run Code Online (Sandbox Code Playgroud)