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 子组件和构建器 的相关文章

  • 为什么 cordova.file.documentsDirectory 为空?

    我正在尝试使用 cordova plugin file transfer 在http ngcordova com docs plugins fileTransfer http ngcordova com docs plugins fileT
  • Android自定义控件命名空间问题

    我一直在为 Android 开发自定义控件 尽管我尝试按照建议进行操作here https stackoverflow com questions 4495511 how to pass custom component parameter
  • Google Play 商店中基于服务的 Android 应用程序

    我正在开发一个应用程序 该应用程序仅包含一些服务 没有任何活动 即没有 UI 基本上 当用户在他 她的设备上安装应用程序时 我希望有 2 到 3 个服务在后台运行 对此我有几个疑问 应用程序安装后我的服务将如何启动 我的BroadcastR
  • 毕加索磁盘缓存

    我正在使用 Picasso 从 URL 加载图像 Picasso with getApplicationContext load product getImageUrl into imageView 据我所知 每次都会访问该网址 而不是缓存
  • BluetoothAdapter.getDefaultAdapter() 不返回 null

    这是我的第一篇文章 所以如果我做了一些愚蠢的事情 请告诉我 这个问题可能看起来与其他帖子类似 但或多或 少与我所看到的所有内容相反 关于该项目的事情 我正在开发 android 4 0 4 4 应用程序 我正在使用蓝牙 我正在运行 andr
  • Android Facebook sdk 3.5 分享对话框

    您好 我正在为 android sdk 3 5 实现 facebook 共享对话框 但是我按照指南没有取得任何成功 FacebookDialog shareDialog new FacebookDialog ShareDialogBuild
  • Android 5.0 Lollipop 中屏幕固定关闭时如何收到通知?

    我有一个在后台运行的应用程序 并在手机上发生特定事件时启动活动 我发现在 Android 5 0 中 当用户使用另一个应用程序打开屏幕固定时 startActivity intent 调用将被完全忽略 我的应用程序不知道该活动尚未启动 因此
  • FLAG_ACTIVITY_REORDER_TO_FRONT 被忽略

    我有一个包含项目列表的 FragmentActivity 当应用程序处于后台时 可以推送该项目列表 发生这种情况时 我想创建一个状态栏通知并提醒用户更新 当用户单击通知时 活动应重新排序到前面并显示在屏幕上 同时在列表底部显示新项目 所以我
  • android:进程和进程名称

    我试图理解android process属性 Ref says http developer android com guide topics manifest application element html proc 如果分配给该属性的
  • 更改 Android 中的媒体音量?

    我可以更改媒体音量吗 如何 到目前为止我用过这个 setVolumeControlStream AudioManager STREAM MUSIC 但有一个搜索栏并且想要更改媒体音量 而不是铃声音量 那么有人可以告诉我如何更改媒体音量onC
  • 使用 mupdf android 库导航到特定页面

    我如何使用 muPDF 库导航到特定页面 或者有没有办法让图书馆不记得我最后在那个pdf文件中浏览的是哪一页 Uri uri Uri parse path Intent intent new Intent MainActivity getC
  • 将图像保存到内部存储器并将出现在图库中

    我搜索了很多与我的问题相关的问题 是否有办法将图像存储在内存中并且它也应该出现在图库中 这是完全有可能的 我以前也这么做过 在将图像保存到内存 或称为应用程序文件夹等 之前 您最好设置Context MODE WORLDREADABLE 虽
  • 如何在android中画一条曲线?

    我是 Android 新手 正在开发一个关于绘制线条的示例项目 我想画一条连接两点的曲线或高架线 x1 y1 and x2 y2 我试过canvas drawArc 方法 但是RectF内的值drawArc方法只是圆的 x y 中心点 它在
  • Android:BATTERY_STATUS_DISCHARGING 和 BATTERY_STATUS_NOT_CHARGING 之间的区别

    我想知道这两个标志之间的区别 BatteryManager BATTERY STATUS DISCHARGING And BatteryManager BATTERY STATUS NOT CHARGING 我开发了一个使用这两个标志的应用
  • 在 android 版本 7.0 上膨胀类 android.widget.DatePicker 时出错

    我想显示弹出日期选择器并且我使用此代码 Calendar mcurrentDate Calendar getInstance int mYear mcurrentDate get Calendar YEAR int mMonth mcurr
  • SDK尚未初始化,请务必先调用FacebookSdk.sdkInitialize()

    我在实现 Facebook SDK 时遇到此错误 并且我tried https stackoverflow com questions 15490399 error inflating class com facebook widget l
  • 如何在 onDraw() 方法中定义与像素无关的高度

    我扩展了 View 来构建自定义小部件 我想用独立的像素单位定义小部件的高度 我认为可以通过将像素密度乘以所需的高度来完成 但我不知道该怎么做 到目前为止我所拥有的 最小化 public class Timeline extends Vie
  • 使用 RecyclerView.Adapter 在 onBindViewHolder() 内设置 onItemClickListener

    我有一个自定义对象 学生班 public class Student private String name private String age public String getName return name public void
  • 改造方法调用可能会产生“java.lang.NullPointerException”

    使用 Retrofit 2 3 0 我在 Android Studio 中收到以下消息 有关如何删除此 IDE 错误消息的任何建议 谢谢 来自Response文档 http square github io retrofit 2 x ret
  • Application.onLowMemory() 未调用

    我创建了自己的应用程序类 我尝试调试它 代码在 Application onCreate 处停止 但不会在 onLowMemory 处停止 为了测试该场景 我打开了许多其他高内存应用程序 我看到的是调试会话终止 在 Eclipse 中 并且

随机推荐

  • 如何在 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