在单个活动应用程序中使用Dagger范围在片段之间共享ViewModel

时间:2020-11-06 19:57:28

标签: android android-fragments dagger-2 dagger android-viewmodel

Navigation component建议使用单一活动架构,Dagger上的页面建议使用Dagger范围跨片段共享常见的ViewModel。

但这需要拥有一个父Activity,片段从中获得Dagger组件,如文档中的这一行所示:(activity as LoginActivity).loginComponent.inject(this)

当您在整个应用程序中只有一个活动时,这毫无意义,因为这与整个应用程序生命周期中使用@Singleton范围基本上相同。这也使您无法使用FragmentScenario来测试片段,因为它们现在已经与您的特定活动相关联了。

通过Dagger跨片段共享单个ViewModel而不给它@Singleton范围或将其绑定到Activity的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

我猜您正在谈论androidx.lifecycle.ViewModel,它管理着自己的生命周期,并且不应该具有任何范围以允许其执行那。如果您将自己的作用域添加到顶部,它将最终导致损坏和/或令人困惑的行为。

因此,您不应直接注入这些ViewModel,而应使用ViewModel工厂和查找方法,或者-再次-由于ViewModel的行为将不同于其所有行为,因此您最终将遭受破坏和/或混乱的行为官方文件说明。 (您可能编写了一些样板文件将此过程移至模块中,但最终您仍然需要让androidx管理生命周期)

如果您不想使用androidx.lifecycle.ViewModel,但想要获得相同/相似的行为,则必须在组件之间创建自己的作用域。该作用域的生存期应比应用程序短[em> ,但生存期应比任何单个Activity实例长 ,以允许在更改配置等之后重用这些对象。