我有一个应用程序有一个 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 的概念需要像 Activity
或 NavGraph
这样的 Shared Scope。
- 使用 Activity
改变
private val viewModel: AuthViewModel by viewModels()
到
private val viewModel: AuthViewModel by activityViewModels()
- 使用导航图
创建另一个导航图,其中有两个用于身份验证的 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/