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()因此,在您的情况下,您将在两个片段中使用,这为您提供了与每个片段绑定的两个不同的视图模型实例。
共享视图模型的概念需要一个共享范围,例如Activity或NavGraph。
只是改变
private val viewModel: AuthViewModel by viewModels()
Run Code Online (Sandbox Code Playgroud)
到
private val viewModel: AuthViewModel by activityViewModels()
Run Code Online (Sandbox Code Playgroud)
创建另一个导航图,其中有两个用于身份验证的片段。
<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)
| 归档时间: |
|
| 查看次数: |
4182 次 |
| 最近记录: |