【问题标题】:Shared View Model between two fragments in the nav_graphnav_graph 中两个片段之间的共享视图模型
【发布时间】:2020-10-16 08:11:53
【问题描述】:

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

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

private val viewModel: AuthViewModel by viewModels()

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

AuthViewModel.kt

class AuthViewModel @ViewModelInject constructor(
    private val authRepository: AuthRepository
) : BaseViewModel()

这里还有什么我遗漏的步骤吗?

编辑

我正在通过onViewCreated 方法访问数据

【问题讨论】:

    标签: android android-studio android-viewmodel android-architecture-navigation android-navigation


    【解决方案1】:

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

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

    Shared Viewmodel 的概念需要一个 Shared Scope,例如 ActivityNavGraph

    1. 使用活动

    只是改变

    private val viewModel: AuthViewModel by viewModels()
    

    private val viewModel: AuthViewModel by activityViewModels()
    
    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>
    

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

    private val viewModel: AuthViewModel by navGraphViewModels(R.id.authenticationNavGraph)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 2021-04-06
      • 2010-10-22
      • 2014-05-05
      • 1970-01-01
      相关资源
      最近更新 更多