我的应用由一个Activity
和多个组成Fragments
,遵循“单个 Activity 应用模型”,因此我可以使用Navigation Component
Android 中的 正确导航jetpack
。
我的大多数屏幕 ( Fragments
) 都是独立的,不相互依赖,因此它们使用自己的ViewModel
有些功能需要涉及多个导航Fragment
。由于这些功能在它们之间共享通过 来回传递的数据Fragments
,因此我使用共享的 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
需要 shared的第一个时ViewModel
,ViewModelProviders.of()
将返回与ViewModel
以前相同的实例:在ViewModel
之间共享Fragments
,但也在不同导航之间实现了类似的功能这个。
我理解为什么会发生这种情况(Android 将 ViewModel 存储在 a中,在请求withmap
时正在使用它),但我不知道我应该如何正确实现“共享 ViewModel 模式”。ViewModel
ViewModelProviders.of()
我看到的唯一解决方法是:
- 为使用共享
Activity
功能的功能创建一个不同的Fragment
ViewModel
- 使用嵌套,并为使用共享的功能
Fragments
使用公共父级Fragment
Fragment
ViewModel
使用这两个选项,我将能够创建一个ViewModel
将Fragments
在功能干预之间共享,并且每次导航到该功能时都会有所不同。
我在这里看到的问题是,这似乎Navigation Component
与单个Activity
应用程序的基本原理背道而驰。以这种方式实现的每个功能都需要具有不同的导航图,因为它们将使用不同的导航主机。这会阻止我使用Navigation Component
.
实现我想要的正确方法是什么?我错过了什么,还是它就是这样?
之前Navigation Component
我会使用不同的Activities
andFragments
和使用与/Dagger
关联的范围来实现这一点。但我不确定只用一个 Activity 来实现它的最佳方法是什么Activity
Fragment