我的应用程序由一个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
之前,我将使用不同的Activities
和Fragments
,并使用与Dagger
/ Activity
关联的Fragment
范围来实现此目的。但是我不确定仅通过一个Activity来实现这一目标的最佳方法是什么?
ViewModel
的相同实例,因为它属于Activity
-很明显。我不确切知道您的用例,但是通常当我需要执行类似操作时,我只是从ViewModel
Fragment's
或onCreate
通知orCreateView
并传递一些标识符。在您的情况下,可能类似于:viewModel.onNavigatedTo("fragment1")
通过这种方式,共享视图模型可以区分当前使用哪个片段并相应地刷新状态。