我有一个应用程序,其中有一个活动,其中有29个片段,其中nav_graph
两个片段用于身份验证,我需要使用ashared view model
而不是其他片段共享这两个片段之间的数据。
因此,我创建了myViewModel
并将其使用库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()
在两个片段中使用,这将为您提供绑定到每个片段的两个不同的viewmodel实例。
共享视图模型的概念需要一个像Activity
或的共享范围NavGraph
。
只是改变
private val viewModel: AuthViewModel by viewModels()
至
private val viewModel: AuthViewModel by activityViewModels()
创建另一个导航图,其中有两个用于身份验证的片段。
<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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句