【问题标题】:How to create custom scope and share same instances using Dagger Android如何使用 Dagger Android 创建自定义范围并共享相同的实例
【发布时间】:2018-04-26 04:52:30
【问题描述】:

以下是我从doc 了解到的事情

  1. Dagger Android 正在为每个带有 ContributesAndroidInjector 注释的 Activity 创建子组件
  2. 您可以将自定义范围应用于 ContributesAndroidInjector 被注释到的方法
  3. 如果两个同级子组件具有相同的作用域,它们仍然会有不同的作用域实例
  4. 如果 Activity 在子组件中,它可以有自己的子组件,其中可以包含 Fragment。这些 Fragments 将共享 Activity 具有的作用域实例。

现在我的问题是: 如何使用 Dagger Android 让一个 Activity 成为另一个 Activity 的子组件?

我想这样做是因为我想实现@UserScope/@SessionScope 之类的东西。

来自this 我知道我可以只使用 Dagger 而不是 Dagger Android。但是使用Dagger Android,你只能让Application(也就是AndroidInjector)来注入Activity。您不能将 Activity 用作父子组件的持有者或宿主来注入另一个 Activity。

我理解正确吗?

2018 年 5 月 14 日更新:

我最终摆脱了 Dagger Android。所以没有更多的ContributesAndroidInjector,只是纯粹的匕首。为了注入 Activity/Fragment,我使用推荐的方式 here。它会是这样的:

class MyActivity : AppCompatActivity() {
    private val factory: ViewModelProvider.Factory = Injector.myCustomScope().factory()
}

我们正在努力确保工厂是 Activity/Fragment 唯一需要的东西。

到目前为止一切都很好。

【问题讨论】:

    标签: android dagger-2 dagger


    【解决方案1】:

    如何使用 Dagger Android 让一个 Activity 成为另一个 Activity 的子组件?

    tl;dr 你不能。 Dagger Android 遵循严格的AppComponent > ActivityComponent > FragmentComponent 方案,无法在两者之间添加自定义范围。


    我建议你看一下 Dagger Android 源代码,真的不多。对于您在其中查找组件构建器并构建子组件的每一层,它基本上都是一个 HashMap。一个片段查看其父 Activity,一个 Activity 查看应用程序。没有可以在层之间添加自定义组件的功能。

    可以做的是创建自己的“Dagger Android”变体,您可以在其中实现自己的接口并根据需要混合/匹配组件。但这是相当多的额外工作。如果您有兴趣了解如何做到这一点,我创建了一个 @PerScreen scope that survives configuration changes 作为概念证明。

    【讨论】:

    • 感谢您的回答。如果您不介意我在这里问一个后续问题,我应该如何实现类的同一实例仅在活动 B、C 和 D 之间共享但不在 A 之间共享的目标(@UserScope 示例) ?
    • Dagger 提供的AndroidInjection 是不行的。检查我链接的要点。您必须在用户登录时将其持久化,而不是在每个活动中持久化组件。然后,您必须找到一种方法来从您的 userComponent 或 appComponent 实例化子组件,具体取决于哪个活动。我确信这是可行的,但您应该确保了解 Dagger 的工作原理,否则这将是一项乏味的任务。有很多关于如何做用户范围的指南,您也可以按照这些指南进行操作。
    【解决方案2】:

    您可以创建一个名为 @PerScreen 的自定义范围,您也将拥有 @PerActvity 范围。这些作用域之间的区别在于,@PerActivity 作用域将维护所有活动之间的共享依赖关系,如Context、Layout Inflater 等。所有活动特定的依赖关系都将被限定为@PerScreen

    @PerApplication -> @PerActivity -> @PerScreen
    

    这可能是这样的结构。 我已经在 my blog post 中解释了作用域,你可以参考它来更好地理解这个问题。

    【讨论】:

      猜你喜欢
      • 2018-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-17
      相关资源
      最近更新 更多