【问题标题】:Share ViewModel across Fragments with Dagger Scopes in Single Activity App在单个 Activity 应用程序中使用 Dagger 范围跨 Fragment 共享 ViewModel
【发布时间】:2020-11-06 19:57:28
【问题描述】:

Navigation component 推荐单一 Activity 架构,Dagger 上的页面建议使用 Dagger 范围跨 Fragment 共享通用 ViewModel。

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

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

在不给它@Singleton 范围或将其绑定到 Activity 的情况下,通过 Dagger 跨 Fragments 共享单个 ViewModel 的最佳方式是什么?

【问题讨论】:

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


    【解决方案1】:

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

    因此,您也不应该直接注入这些 ViewModel,而应使用 ViewModel 工厂和查找方法,或者 - 再次 - 由于 ViewModel 的行为与它所有官方文件指出。 (你可能会写一堆样板来将这个过程移动到模块中,但最终你仍然需要让 androidx 管理生命周期)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      • 2017-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多