使用 Dagger 模块而不使用“injects”指令

2024-01-11

我试图让 Dagger 在 @Module 注释中没有“injects”指令的情况下工作。我的测试项目基于Android 简单 Dagger 示例 https://github.com/square/dagger/tree/master/examples/android-simple

这是给我带来问题的部分:

@Module(
    injects = HomeActivity.class,
    complete = false
)
public class DemoModule {
  // TODO put your application-specific providers here!
}

(编辑):我的代码中是CTXModules.java https://github.com/pepitoria/DaggerTests/blob/master/src/com/ef/daggertestproject/dagger/CTXModules.java

我想删除的部分是“injects = HomeActivity.class”。我知道我可以在构造函数中使用 @Inject 注释标记我自己的模块,以删除该部分,但不知何故,它不适用于添加到图中的模块。有了那条线,一切就都正常了。

我需要这个的原因是因为 dagger 将在一个基础库项目中实现,该项目将成为一些共享公共代码库的项目的基础,因此目前或编写这部分代码我不知道是什么类将注入模块。

我想做的事情可能吗?

我认为这是可能的,因为Android 模块类 https://github.com/square/dagger/blob/master/examples/android-simple/src/main/java/com/example/dagger/simple/AndroidModule.java不使用该指令。

希望它足够清楚。提前致谢!

(EDIT)

我应该提到这一点。在我的模块中,我删除“injects = HomeActivity.class”并添加“library = true”,如Android 模块类 https://github.com/square/dagger/blob/master/examples/android-simple/src/main/java/com/example/dagger/simple/AndroidModule.java。然后发生的事情是我收到此错误(我的错误是我之前没有添加它):

12-10 09:21:16.807: E/AndroidRuntime(21783): FATAL EXCEPTION: main
12-10 09:21:16.807: E/AndroidRuntime(21783): Process: com.ef.daggertestproject, PID: 21783
12-10 09:21:16.807: E/AndroidRuntime(21783): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ef.daggertestproject/com.ef.daggertestproject.MainActivity}: java.lang.IllegalArgumentException: No inject registered for members/com.ef.daggertestproject.MainActivity. You must explicitly add it to the 'injects' option in one of your modules.
12-10 09:21:16.807: E/AndroidRuntime(21783):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2176)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2226)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at android.app.ActivityThread.access$700(ActivityThread.java:135)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at android.os.Handler.dispatchMessage(Handler.java:102)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at android.os.Looper.loop(Looper.java:137)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at android.app.ActivityThread.main(ActivityThread.java:4998)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at java.lang.reflect.Method.invokeNative(Native Method)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at java.lang.reflect.Method.invoke(Method.java:515)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at dalvik.system.NativeStart.main(Native Method)
12-10 09:21:16.807: E/AndroidRuntime(21783): Caused by: java.lang.IllegalArgumentException: No inject registered for members/com.ef.daggertestproject.MainActivity. You must explicitly add it to the 'injects' option in one of your modules.
12-10 09:21:16.807: E/AndroidRuntime(21783):    at dagger.ObjectGraph$DaggerObjectGraph.getInjectableTypeBinding(ObjectGraph.java:281)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at dagger.ObjectGraph$DaggerObjectGraph.inject(ObjectGraph.java:258)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at com.ef.daggertestproject.MyApplication.inject(MyApplication.java:47)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at com.ef.daggertestproject.BaseActivity.onCreate(BaseActivity.java:27)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at com.ef.daggertestproject.MainActivity.onCreate(MainActivity.java:16)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at android.app.Activity.performCreate(Activity.java:5243)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
12-10 09:21:16.807: E/AndroidRuntime(21783):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2140)
12-10 09:21:16.807: E/AndroidRuntime(21783):    ... 11 more

另外,我还上传了我的测试项目到github https://github.com/pepitoria/DaggerTests

(最终编辑)根据 Jake 的回答:“将模块声明为库并不能减轻 Dagger 了解注入点的需求。”因此,我最初的问题的答案是,这是不可能的。


You want

@Module(library=true)

这是文档所说的library:

如果此模块中包含的所有绑定都是满足其所有可注入类型所必需的,则为 False。如果模块不是库模块,则它有资格进行额外的静态检查:工具可以检测是否不需要包含的绑定。如果您提供此模块的图形未使用的绑定,则必须声明library = true。

(强调我的)


将模块声明为库并不能减轻 Dagger 了解注入点的需求。您仍然必须使用列出的注入在对象图中声明一个模块。

您的示例的极端简化版本如下所示:

repo/
 +- library/
 |   +- Foo.java
 |   `- FooModule.java
 |
 `- app/
     +- BarActivity.java
     `- BarModule.java

FooModule.java:

@Module(library = true)
public final class FooModule {
  @Provides @Singleton provideFoo() {
    return Foo();
  }
}

BarModule.java:

@Module(
  injects = BarActivity.class,
  includes = FooModule.class
)
public final class BarModule {
}

In BarActivity.java(或类似):

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

使用 Dagger 模块而不使用“injects”指令 的相关文章

  • 对象映射器 - YAMLFactory - 由于缺少 _createContentReference 方法而出现异常

    我正在使用最新的 2 13 0 版本的 jackson 当我尝试解析 YAML 文件时 出现此异常 java lang NoSuchMethodError com fasterxml jackson core io ContentRefer
  • 检查更新时 Maven 无限期挂起

    我正在使用 Maven 构建一个项目 我是新手 并且它挂起 mvn package INFO Scanning for projects INFO INFO Building Presentation Reports INFO task s
  • 无法删除临时文件夹(有时)

    当我启动应用程序时 我创建一个临时文件夹 public static File createTempDir String name throws IOException File tempDir File createTempFile na
  • SwingUtilities.invokeLater

    我的问题与SwingUtilities invokeLater 我应该什么时候使用它 每次需要更新 GUI 组件时都必须使用吗 它到底有什么作用 是否有替代方案 因为它听起来不直观并且添加了看似不必要的代码 Do I have to use
  • Netty Nio java 中的通信

    我想在 Netty nio 中创建一个具有两个客户端和一个服务器的通信系统 更具体地说 首先 我希望当两个客户端与服务器连接时从服务器发送消息 然后能够在两个客户端之间交换数据 我正在使用本示例提供的代码 https github com
  • 长按 HOME 按钮菜单隐藏 Android 应用程序

    我想从 且仅从 完成后长时间按住 HOME 按钮时出现的菜单中隐藏我的 Android 应用程序 有没有办法做到这一点 以编程方式调用 finish 并不能解决问题 有很多关于从启动器和任务管理器隐藏应用程序的线程 但这不是我想要的 我只是
  • 如何从MediaCodec获取解码格式?

    我正在与MediaCodec 我用它来解码 mp4 video MediaCodec 将视频解码为YUV格式 但我需要得到RGBA 一切都很好 但我发现有几种可能的格式 例如YUV420 YUV422等等 因此 据我所知 要进行转换 我需要
  • 覆盖Java中的属性[重复]

    这个问题在这里已经有答案了 在 Java 中 我最近有几个项目 我使用了这样的设计模式 public abstract class A public abstract int getProperty public class B exten
  • 如何根据从 jtextfield 和组合框接收的值将数据行添加到 Jtable

    我有一个JFrame表格有JTextFields JCombobox等等 我能够将这些值接收到变量 现在我想将接收到的数据添加到JTable当用户单击 添加 或类似的操作时在新行中 我创造了JTable使用 net beans 的问题是将这
  • 点击按钮时的 Admob 插页式广告

    我有一个应用程序 我正在使用 admob 横幅 现在我想在点击按钮时显示插页式广告 我的应用程序有 2 个活动 我想在第二个活动上显示插页式广告 第二个活动有一个返回第一个活动的按钮 我想在单击按钮后显示广告 我可以在单击按钮时显示广告 但
  • Tomcat下的Spring CXF Soap Web服务:找不到服务

    我正在尝试使用 CXF 和 Spring 设置一个在 Tomcat 上运行的简单 CXF Web 服务 我有一个 Web 应用程序初始化程序来引导 CXF servlet public class WebAppInitializer ext
  • 找不到元素“android.support.constraint.ConstraintLayout”的声明

    我创建了一个名为的 xml 文件activity main sw50dp 但是当我尝试验证它时 它给了我错误 错误 4 42 cvc elt 1 a 找不到元素 android support constraint ConstraintLa
  • 为什么从类构造函数调用的方法应该是最终的? [复制]

    这个问题在这里已经有答案了 我是一名 Java 新手 我试图理解 Oracle 网站教程中的以下行 https docs oracle com javase tutorial java IandI final html https docs
  • Android onclicklistener 在第一次点击时不起作用

    我有一个带有默认文本的 EditText 现在 当用户单击该 EditText 时 默认文本应该更改为某些内容 我所拥有的是 我单击 EditText 光标出现在默认文本之后 没有任何反应 当我再次单击时 onClickListener 就
  • 图标和导航视图之间的左边距

    我必须在图标和图标之间添加左边距NavigationView 如下图中箭头所示 我知道根据谷歌规范 这个边距必须有16dp但我需要改变它 我努力了
  • 尝试通过 Java 8 中的 JDBC-ODBC 连接到 .accdb 文件时出现 ClassNotFoundException

    我正在 Eclipse EE IDE 中的 Java 项目中工作 我必须在其中查询 accdb文件 问题是当我尝试加载驱动程序然后连接到数据库时 它给了我一个异常错误 My code try String filePath myfilepa
  • Java环境变量设置方法

    我已将以下行插入 bash profile export GOOGLE APPLICATION CREDENTIALS Users jun Downloads export PATH PATH GOOGLE APPLICATION CRED
  • Zookeeper 未启动,nohup 错误

    我已经下载了zookeeper 3 4 5 tar gz 解压后我将conf zoo cfg写为 tickTime 2000 dataDir var zookeeper clientPort 2181 现在我尝试通过 bin zkServe
  • Jetpack 中的波浪框组成

    有没有办法用Canvas制作一个顶部有波浪形的盒子 我想知道这个效果是否可以直接用Canvas来实现 不需要有滚动动画 不太清楚你为什么在谈论Canvas 要裁剪这样的视图 您可以使用自定义Shape并将其应用到您的视图中Modifier
  • 加载 highchart 时 Android 错误膨胀类

    我正在尝试加载highcharts via Dialog 下面是我的代码 Gradle implementation com highsoft highcharts highcharts 9 0 1 XML

随机推荐

  • 在 Python 中计算元组内的项目数

    我对 python 相当陌生 我不知道如何执行以下操作 我有一个 单词 标签 元组列表 a Run Noun Run Verb The Article Run Noun The DT 我试图找到分配给每个单词的所有标签并收集它们的计数 例如
  • filezilla,写入失败时出错

    我正在通过 SFTP 和 FileZilla 传输一个非常大 35GB 的文件 现在转账是59 7 完成了 但我不断收到此错误 并且几个小时内该数字都没有改变 Error File transfer failed after transfe
  • 如何对 TextView 中的每个单词而不是每个字符进行字母/翻译动画?

    我正在与以下人员合作Spannable and TextView像这样 我已经为每个角色设置了动画 但我想为每个单词设置动画 我怎样才能做到这一点 查看字母并翻译每个单词 从每个单词位置的底部开始 我所说的翻译是指翻译 移动 动画 Sour
  • kubernetes 错误:跳过 pod 同步

    我已经在centos 7上配置了kubernetes master 并在另一个节点centos 7上配置了kubernetes节点 kube master 上运行的服务 kube 控制器管理器 kube api服务器 kube 调度程序 e
  • 为我的流星应用程序设置谷歌登录配置后,如何重置谷歌登录配置?

    我正在学习流星并创建了一个新的应用程序并安装了accounts core accounts google 和accounts ui 这按预期工作并提示我配置谷歌集成 不过 在配置之后 我意识到我使用了错误的 url 并在 Google AP
  • 动画可见性模式,“消失”和“可见”

    因此 当我使用其他小部件设置线性布局的可见性时 我尝试制作动画 从 消失 到 可见 以及相反 我使用切换按钮来显示和隐藏 这是一张显示我想做的事情的图片 我可以显示和隐藏 但我不知道如何正确设置滑动动画 这是我的 xml
  • 用于自动添加“using”语句的 Visual Studio 键盘快捷键

    从小红线开始展开菜单并提供必要选项的键盘快捷键是什么using语句附加到文件顶部 Ctrl shows the menu I find this easier to type than the alternative Alt Shift F
  • 如何使用 jest 模拟 Node-Redis

    我在用jest https github com facebook jest并试图嘲笑节点redis https github com NodeRedis node redis using redis模拟 https github com
  • 以可变的方式绑定成员函数

    我有一个带有可变数量参数的成员函数 存储在std function 我想绑定实例并获得一个独立的函数对象 template
  • 错误:调用 `server.applyMiddleware()` 之前必须 `await server.start()`

    更新后apollo server到版本 3 控制台中显示以下错误 C projects my project node modules apollo server core src ApolloServer ts 554 throw new
  • 如何在 python 中检查字符串是否只包含数字?

    如何检查字符串是否只包含数字 我已经在这里尝试过 我想看到实现这一目标的最简单方法 import string def main isbn input Enter your 10 digit ISBN number if len isbn
  • 使用 DirectoryServices.Protocols 进行 LDAP 搜索速度慢

    我们使用 System DirectoryServices DirectorySearcher 进行 sAMAccountName 查找 这工作得很好 只是当查询某个我们怀疑很大的 AD 时 搜索经常会超时 经过一些研究后 我发现在查询大型
  • C 中不透明类型的定义是什么?它们何时必要和/或有用?

    我已经看到过一些 不透明类型 的概念 但我确实还没有找到一个简洁的答案来说明 C 中不透明类型的定义 更重要的是它们允许我们通过它们的存在来解决哪些问题 谢谢 它最常用于图书馆目的 c 中不透明类型背后的主要原理是通过其指针使用数据以隐藏数
  • 调用堆栈窗口始终为空

    被引入调用堆栈窗口后这个 ASP NET MVC 视频 http channel9 msdn com blogs matthijs aspnet mvc 2 basics introduction by scott hanselman我试图
  • 仅当调整大小结束时才调整 winform 窗口的大小

    有没有办法调整大小Winform窗户就在调整末端大小 这意味着只要单击鼠标 我就会看到线条 并且只有当我离开鼠标 调整大小结束 时 窗口才会在屏幕上调整大小 您将需要使用绘制可逆框架 http msdn microsoft com en u
  • dotnet core 3.1 中 CORS 响应预检的问题

    我面临这个问题 访问 XMLHttpRequest 位于 http localhost 5000 api surpactemp http localhost 5000 api surpactemp 从原点 http 本地主机 4200 ht
  • Backbone JS 多级导航示例

    我正在尝试构建一个可靠的 Backbone JS 实验 其中我有一个包含我的页面的本地 JSON 数据文件 我正在做的一个项目无论如何都有这种要求 我已经编写了这个示例 以便我可以在页面数据中拥有无限的嵌套子页面 看起来效果很好 但当涉及到
  • 在野兽 1.70.0 中使用 Tcp 超时

    我刚刚更新了 boost 库1 68 0 to 1 70 0获取超时操作 beast websocket ssl 客户端异步 example https www boost org doc libs 1 70 0 libs beast ex
  • iPhone 与非 IOS 设备的蓝牙连接

    我想知道是否有办法将 iPhone 用作 HID 设备 与 PS3 等其他设备一起使用 我检查了蓝牙规范 IOS 设备确实支持 HID 配置文件 因此 我认为使用密钥机制配对我的 iPhone 会很容易 并且应该能够毫不费力地开始使用我的
  • 使用 Dagger 模块而不使用“injects”指令

    我试图让 Dagger 在 Module 注释中没有 injects 指令的情况下工作 我的测试项目基于Android 简单 Dagger 示例 https github com square dagger tree master exam