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