Dagger 2.10 Android 子组件和构建器

2024-05-01

使用新的(2.10 中) dagger.android 类,我尝试使用依赖于其他模块的子组件来注入东西,因此,有一个带有这些模块的设置器的构建器。有关的文档https://google.github.io/dagger/android.html https://google.github.io/dagger/android.html描述了这一点,但不清楚如何实际编写和/或调用这些设置器。

引用上面的链接:

AndroidInjection.inject() 从应用程序获取 DispatchingAndroidInjector 并将您的活动传递给注入(Activity)。 DispatchingAndroidInjector 在 AndroidInjector.Factory 中查找您的 Activity 类(即 YourActivitySubcomponent.Builder),创建 AndroidInjector(即 YourActivitySubcomponent),并将您的 Activity 传递给注入(YourActivity)。

在我看来,为了能够调用构建器的设置器,我需要进入某个地方并确保构建器拥有所有必要的数据?我看到的问题是在运行时,我得到一个IllegalStateException: MODULE must be set,当 AndroidInjector 调用我的子组件生成的构建器时。

所讨论的子组件实际上是用于片段,而不是活动,但我不确定这是否重要。关于如何做到这一点有什么想法吗?


简而言之,你应该覆盖调用seedInstance https://github.com/google/dagger/blob/master/java/dagger/android/AndroidInjector.java#L79在 Builder(它是一个抽象类而不是接口)上提供您需要的其他模块。

edit:在此之前,请检查并确保您确实需要通过该模块。作为达蒙在单独的答案中添加了 https://stackoverflow.com/a/47487355/1426891,如果您正在为 Android 类创建特定模块,则可以依靠该类的自动注入来从此时的图表中提取配置或实例。如果从模块中消除构造函数参数更容易,那么支持他的方法,这也可以提供更好的性能,因为它们避免了不必要的实例和虚拟方法调用。


First, 30 秒内完成 dagger.android:Activity(或 Fragment)不是让每个 Activity 或 Fragment 了解其父级,而是调用AndroidInjection.inject(this),它检查应用程序HasActivityInjector(或父片段、活动和应用程序HasFragmentInjector)。这个想法是您为多重绑定创建的绑定提供一个绑定Map<Class, AndroidInjector.Factory>,其中贡献的绑定是almost您始终编写构建特定于对象的子组件的子组件构建器。

正如你可能会看到的那样AndroidInjection.inject(this) and AndroidInjector.Factory.create(T instance),您没有太多机会将特定于活动或特定于片段的详细信息传递给构建器。相反,这个想法是你的子组件构建器覆盖seedInstance执行。正如文档中的seedInstance:

提供instance用于构建的绑定图中AndroidInjector。默认情况下,这用作BindsInstance方法,但它可以被重写以提供需要引用活动的任何模块。

这应该与将传递给的实例相同inject(Object).

那看起来像这样:

@Subcomponent(modules = {OneModule.class, TwoModule.class})
public interface YourActivitySubcomponent extends AndroidInjector<YourActivity> {

  // inject(YourActivity) is inherited from AndroidInjector<YourActivity>

  @Builder
  public abstract class Builder extends AndroidInjector.Builder<YourActivity> {
    // Here are your required module builders:
    abstract Builder oneModule(OneModule module);
    abstract Builder twoModule(TwoModule module);

    // By overriding seedInstance, you don't let Dagger provide its
    // normal @BindsInstance implementation, but you can supply the
    // instance to modules or call your own BindsInstance:
    @Override public void seedInstance(YourActivity activity) {
      oneModule(new OneModule(activity));
      twoModule(new TwoModule(activity.getTwoModuleParameter()));
    }
  }
}

这里的假设是您需要等待activity模块的实例。如果没有,那么您还可以选择在绑定子组件时调用它们:

@Provides @IntoMap @ActivityKey(YourActivity.class)
AndroidInjector.Factory bindInjector(YourActivitySubcomponent.Builder builder) {
  return builder
      .oneModule(new OneModule(...))
      .twoModule(new TwoModule(...));
}

...但是如果你能做到这一点,那么你可以通过重写这些模块、实现一个可以提供模块构造函数参数的零参数构造函数,并让 Dagger 创建这些绑定,就像为任何模块一样创建这些绑定。具有公共零参数构造函数的模块。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dagger 2.10 Android 子组件和构建器 的相关文章

随机推荐

  • 如何在 Microsoft Excel 中获取两个日期之间的分钟差?

    我正在 Excel 中做一些工作 遇到了一些问题 我正在使用的仪器保存测量的日期和时间 我可以使用以下格式将此数据读入 Excel A B 1 Date Time 2 12 11 12 2 36 25 3 12 12 12 1 46 14
  • 无法运行正在访问 GlassFish v3 上的 EJB 的应用程序客户端

    环境 GlassFish 3 0 1 NetBeans 6 9 JDK 6u21 Problem 无法运行正在访问 EJB 的应用程序客户端 错误报告可以在下面找到http netbeans org bugzilla show bug cg
  • 创建表之间的关系

    我的问题特别是关于 sql server 但任何具有任何数据库背景的人都可以回答 如果我希望表 A 与表 B 在某个列上具有 1 1 关系 我是否应该以某种方式修改 CREATE TABLE 语句来标识这种关系 或者这是根本没有完成的事情
  • 为什么 Clang 更喜欢主模板而不是 C++17 的专业化?

    下列program https godbolt org z f43EK4PnY从此代码中减少question https stackoverflow com questions 66740188 template
  • 获取因子变量中水平和标签之间的原始关联

    我正在寻找一个函数来获取因子变量的原始映射表 我导入一个 Rdata 文件 我有一个名为 FactVar 的因子变量 我知道 FactVar 的映射表如下 010025 gt city1 015146 gt city2 048017 gt
  • 物化视图提交时快速刷新

    我刚刚创建了表 DEPT 和 EMP 如下所示 create table DEPT dept no number dept name varchar 32 dept desc varchar 32 CONSTRAINT dept pk Pr
  • 将一个巨大的字符串参数传递给存储过程

    我有一个存储过程 它有两个参数 ID 和日期 当我将大文本传递给 ID 参数时 仅考虑部分文本 就好像文本在某个地方被剪切一样 我想这是因为当我执行存储过程时如下 exec proc 1 2 3 4 20100101 一切正常 但是当我使用
  • python 求数组中正数之和的函数

    我需要编写一个函数 它接受一个数字数组并找到所有数字的最大和 换句话说 我需要找到正数的总和 我写了这个 我收到 列表超出范围 想法 def maximum sub A x 0 i 0 for i in A while A i gt 0 x
  • 具有不同高度块的三列布局

    我有基于 Twitter Bootstrap 的简单 3 列布局 唯一的问题是 每根柱子都是由不同高度的块组装而成 div class container div class row div class span4 div class bl
  • 笛卡尔坐标到极坐标

    看一下这里的例子 http www brianhare com physicals so html http www brianhare com physics so html 看一下 console log 我在其中使用了这两个主要函数
  • capybara - 单击没有 id 的按钮

    我正在尝试单击此 html 代码中的按钮 div class modal footer div
  • 无法在 Sql Server 中运行分析功能

    在 Oracle 中它运行良好 oracle的查询如下 SELECT TEAM ID LEVEL ID FF ID MODULE ID TERR ID MERGE KEY count distinct TERR ID over partit
  • DateTimeOffset解析和自定义时区

    我们将 XML DateTime 值解析为 DateTimeOffset 值 根据DateTime 的 W3C XSD 文档 http www w3 org TR 2012 REC xmlschema11 2 20120405 dataty
  • $(this).dequeue();与下一个();

    如果我这样做有什么区别吗 queue queue function next next queue function next next versus queue queue function this dequeue queue func
  • 在我的 Linux 机器上安装 lisp

    我使用 Vim 作为我的编辑器 Practical common Lisp 建议安装 Lispbox 我不知道如何使用 emacs 不知道如何用那个 T T 运行 lisp 代码 之后我找到了一个名为 limp vim 的 vim lisp
  • Wordpress 插件 - 调用未定义的函数 finfo_open() [重复]

    这个问题在这里已经有答案了 我正在尝试使用CSV Me http wordpress org plugins csv me 插件 以便让我们的客户将 csv 文件上传到数据库 当我尝试上传文件作为测试时 我收到以下错误消息 Fatal er
  • 从扩展 pug/jade 模板将变量传递到基本布局

    我想通过在扩展基本布局的模板中声明变量来在 body 标记上设置一个类 当我尝试时 body class变量是undefined在布局中 看起来布局是在扩展模板之前执行的 或者它们是在不同的范围内执行的 还有别的办法吗 mixin 在这里可
  • 将搜索栏从 magento 主页的标题中移动

    我是 magento 的新手 我想将搜索栏从标题移动到主页的中间位置 以便它仅显示在主页上 我在 magento 论坛上阅读了许多相关答案 但所有人都在尝试编辑 box css 中的 mini search 元素 但不幸的是我在此文件中没有
  • 如何在CouchDB 2.0中创建TEXT索引?

    我正在读这篇文章https cloudant com blog mango json vs text indexes https cloudant com blog mango json vs text indexes我想在我的 Couch
  • Dagger 2.10 Android 子组件和构建器

    使用新的 2 10 中 dagger android 类 我尝试使用依赖于其他模块的子组件来注入东西 因此 有一个带有这些模块的设置器的构建器 有关的文档https google github io dagger android html