如何使用共享的ViewModel,并避免每次与导航组件一起重用它的相同实例

问题描述 投票:0回答:1

我的应用程序由一个Activity和一个多个Fragments组成,遵循“单个Activity应用程序模型”,因此我可以使用Android Navigation Component中的jetpack正确实现导航。

我的大多数屏幕(Fragments)是独立的,彼此不依赖,因此它们使用自己的ViewModel

某些功能需要导航,涉及多个Fragment。由于这些功能共享它们之间通过Fragments来回传递的数据,因此我使用了[[shared ViewModel(根据Google的建议)。我需要在所有关联的ViewModel中使用共享Fragments的相同实例,因为我需要Fragments共享共享ViewModel的状态。

要在这些关联的ViewModel中使用Fragments的相同实例,从ViewModel获取Activity时,我需要使用父级Fragment(而不是ViewModel)创建ViewModelProviders ]:

val viewModel = ViewModelProviders.of( parentActivity, factory.create() ).get(SharedViewModel::class.java)

但是,这产生了一个问题:当连续导航至需要共享Fragment的第一个ViewModel时,ViewModelProviders.of()将返回与以前相同的ViewModel实例:ViewModel正在Fragments之间共享在不同的导航之间切换到这样实现的功能。

我知道为什么会这样(Android将ViewModel存储在map中,当使用ViewModel请求ViewModelProviders.of()时正在使用该视图模型,但我不知道如何实现“共享ViewModel模式”。

我看到的唯一解决方法是:

    为将Activity与共享的Fragment一起使用的功能创建其他ViewModel
  • 使用嵌套的Fragments,并使用公共父级Fragment作为将Fragment与共享的ViewModel一起使用的功能
  • 使用这两个选项,我将能够创建一个ViewModel,该C0将在介入该功能的Fragments之间共享,并且每次导航到该功能时都会有所不同。

    我在这里看到的问题是,这似乎与Navigation Component和单个Activity应用的基本原理背道而驰。以这种方式实现的每个功能都将需要具有不同的导航图,因为它们将使用不同的导航主机。这将使我无法使用Navigation Component的某些出色功能。

    实现我想要的东西的正确方法是什么?我错过了什么吗?还是现在的样子?

    Navigation Component之前,我将使用不同的ActivitiesFragments,并使用与Dagger / Activity关联的Fragment范围来实现此目的。但是我不确定仅通过一个Activity来实现这一目标的最佳方法是什么?

  • android dagger android-viewmodel android-jetpack-navigation android-navigation-graph
    1个回答
    0
    投票
    您具有共享的ViewModel的相同实例,因为它属于Activity-很明显。我不确切知道您的用例,但是通常当我需要执行类似操作时,我只是从ViewModel Fragment'sonCreate通知orCreateView并传递一些标识符。在您的情况下,可能类似于:

    viewModel.onNavigatedTo("fragment1")

    通过这种方式,共享视图模型可以区分当前使用哪个片段并相应地刷新状态。
    © www.soinside.com 2019 - 2024. All rights reserved.