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()
,这为您提供了绑定到每个片段的两个不同的视图模型实例。
共享视图模型的概念需要像 Activity
或 NavGraph
这样的共享范围。
- 使用Activity
改变一下
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)
我有一个应用程序,其中有一个 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()
,这为您提供了绑定到每个片段的两个不同的视图模型实例。
共享视图模型的概念需要像 Activity
或 NavGraph
这样的共享范围。
- 使用Activity
改变一下
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)