在单个 Activity 应用程序中使用 Dagger Scopes 跨片段共享 ViewModel

Share ViewModel across Fragments with Dagger Scopes in Single Activity App

Navigation component recommends a Single Activity Architecture, and the page on Dagger 建议使用 Dagger 范围在 Fragment 之间共享公共 ViewModel。

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

当您的应用程序中只有一个 Activity 时,这有点毫无意义,因为这与在整个应用程序的生命周期内使用 @Singleton 范围基本相同。它还会阻止您使用 FragmentScenario 来测试您的片段,因为它们现在与您的特定 Activity.

相关联

通过 Dagger 跨 Fragment 共享单个 ViewModel 的最佳方式是什么,而不给它一个 @Singleton 范围或将它绑定到一个 Activity?

我猜你说的是 androidx.lifecycle.ViewModel,它管理自己的生命周期,不应该任何范围 允许它这样做。如果您在顶部添加自己的范围,它最终会导致损坏 and/or 令人困惑的行为。

因此,您不应该直接注入那些 ViewModel,而应该使用 ViewModel 工厂和查找方法,否则您最终会遇到 and/or 令人困惑的错误行为,因为 ViewModel 的行为与它的所有官方文档都说明了什么。 (你可能会写一堆样板来将这个过程移动到模块中,但最终你仍然需要让 androidx 管理生命周期)

如果您不想使用 androidx.lifecycle.ViewModel 但想要获得 same/similar 行为,那么您必须创建自己的范围 in-between 组件。该范围应该比应用程序,但比任何单个Activity实例,以允许在配置后重用这些对象变化等等。