如何修复 Dagger 2 错误“...无法提供 [...]”?

2023-11-30

这是一个规范问题因为这是 Dagger 2 的一个常见错误。

如果您的问题被标记为重复请仔细阅读这篇文章并确保了解此错误的含义以及发生的原因。如果这篇文章不适合您,请务必包含 where and how 您提供提到的课程并包括完整的错误消息在你的问题中,就像这里的问题一样。

我尝试使用 Dagger 2 的依赖项,但当我尝试编译项目时收到以下错误:

error:com.example.我的依赖如果没有 @Inject 构造函数或 @Provides 注解的方法,则无法提供。

com.example.我的依赖提供于
com.example.MyComponent.myDependency()

这是什么意思以及如何解决它?

我有一个组件并尝试提供依赖项。我的基本设置如下所示:

// this is the dependency I try to use
class MyDependency {}

@Component
interface MyComponent {
    // I want to make it accessible to be used with my component
    MyDependency myDependency();
}

tl;dr您忘记添加@Inject到您的构造函数,以便 Dagger 可以使用构造函数注入来提供对象,或者您需要在模块之一中使用某种方法来创建或绑定该对象。


这是怎么回事?

仔细查看错误消息:它指出您尝试请求依赖项,但是Dagger 无法提供或创建它。它根本不知道如何做,因为它如果没有 @Inject 构造函数或 @Provides 注解的方法,则无法提供。

仔细查看错误消息显示了该类(a)您试图提供的组件(b)需要它。

com.example.MyDependency(a)提供于
com.example.MyComponent.myDependency()(b)

你必须确保(b)可以创建或提供(a)解决您的问题。

如果您尝试在其他地方注入依赖项,它看起来会更复杂一些,但您仍然可以看到完整的事件堆栈 - 在这种情况下,构造函数注入缺少依赖项。班上(a)您试图提供的内容和位置(b)Dagger 尝试注射它的地方。它还告诉您该依赖类是在哪里创建的(c)再次是组件(d)未能提供(a).

如果没有 @Inject 构造函数或 @Provides 注解的方法,则无法提供 com.example.MyDependency。
com.example.MyDependency(a)注射于
com.example.DependentClass.(依赖项)(b)
com.example.DependentClass 提供于(c)
com.example.MyComponent.myDependency()(d)

这同样适用于这里:确保(d)知道如何提供(a)现在就可以走了。

我该如何解决?

查看如上所示的错误。确保你明白where它发生了并且what你正在尝试注射。然后告诉 Dagger 如何提供你的对象。

@Inject 构造函数

正如错误所述,您尝试使用MyDependency but MyComponent不知道该怎么做。如果我们看一下这个例子,就会明白为什么:

class MyDependency {}

班级有no @Inject带注释的构造函数!而且该组件中没有其他模块,因此 Dagger 无能为力。

如果你想使用构造函数注入,你可以add an @Inject带注释的构造函数并完成。 Dagger 将看到这个构造函数并知道如何创建您的类。

class MyDependency {
    @Inject
    MyDependency() { /**/ }
}

当您可以使用构造函数注入时,这就是您所要做的全部事情。

来自@Provides注释的方法

错误消息指出了第二个选项,如果您不想或不能使用构造函数注入,则可以使用该选项提供对象。你也可以add a @Provides带注释的方法到一个模块并将该模块添加到您的组件中。

@Module
class MyModule {
    @Provides
    MyDependency provideMyDependency() {
        return new MyDependency();
    }
}

@Component(modules = MyModule.class)
interface MyComponent {
    MyDependency myDependency();
}

这样 Dagger 就可以使用您的模块来创建并提供您的依赖项。它比使用构造函数注入要多一点样板,但是您必须使用模块来处理需要进一步设置或没有带注释的构造函数的所有内容,例如第三方库,例如 Retrofit、OkHttp 或 Gson。


还有其他方法可以提供组件的依赖关系。 A@SubComponent可以访问其父依赖项,并且组件依赖项可以将其某些依赖项公开给其依赖组件。但在某些时候,Dagger 提供的所有东西都需要有一个@Inject构造函数或提供它的模块。

但我确实添加了MyDependency!

密切关注细节。当您只提供实现时,您可能正在使用接口,或者当 Dagger 只知道子类时尝试使用父类。
也许您添加了自定义@Qualifier或使用过@Named("typeA")用它。对于 Dagger 来说,这是一个完全不同的对象!仔细检查您是否确实提供并请求相同的依赖项。

阅读错误并确保您有@Inject带注释的构造函数,一个具有@Provides方法提供该类型,或具有此功能的父组件。

如果我想为我的接口提供一个实现怎么办?

下面的一个简单示例展示了一个类如何扩展另一个类:

class MyDependency extends MyBaseDependency {
    @Inject MyDependency() { super(); }
}

这将告知 DaggerMyDependency, 但不是关于MyBaseDependency.

如果您有一个类实现接口或扩展超类,则必须声明这一点。如果您提供MyDependency这并不意味着 Dagger 可以提供MyBaseDependency。您可以使用@Binds告诉 Dagger 你的实现并在需要超类时提供它。

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

如何修复 Dagger 2 错误“...无法提供 [...]”? 的相关文章

  • java.lang.NoClassDefFoundError:org.apache.batik.dom.svg.SVGDOMImplementation

    我在链接到我的 Android LibGDX 项目的 Apache Batik 库时遇到了奇怪的问题 但让我们从头开始 在 IntelliJ Idea 中我有一个项目 其中包含三个模块 Main Android 和 Desktop 我强调的
  • Java EE:如何获取我的应用程序的 URL?

    在 Java EE 中 如何动态检索应用程序的完整 URL 例如 如果 URL 是 localhost 8080 myapplication 我想要一个可以简单地将其作为字符串或其他形式返回给我的方法 我正在运行 GlassFish 作为应
  • 如何找到给定字符串的最长重复子串

    我是java新手 我被分配寻找字符串的最长子字符串 我在网上研究 似乎解决这个问题的好方法是实现后缀树 请告诉我如何做到这一点或者您是否有任何其他解决方案 请记住 这应该是在 Java 知识水平较低的情况下完成的 提前致谢 附 测试仪字符串
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • 反射找不到对象子类型

    我试图通过使用反射来获取包中的所有类 当我使用具体类的代码 本例中为 A 时 它可以工作并打印子类信息 B 扩展 A 因此它打印 B 信息 但是当我将它与对象类一起使用时 它不起作用 我该如何修复它 这段代码的工作原理 Reflection
  • 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

    我正在开发一个 spring webflow 项目 我想我可以使用 HSQLDB 而不是 mysql 进行 junit 测试吗 如何将我的 mysql 数据库克隆到 HSQLDB 如果您使用 spring 3 1 或更高版本 您可以使用 s
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • 如何在 javadoc 中使用“<”和“>”而不进行格式化?

    如果我写
  • AWS 无法从 START_OBJECT 中反序列化 java.lang.String 实例

    我创建了一个 Lambda 函数 我想在 API 网关的帮助下通过 URL 访问它 我已经把一切都设置好了 我还创建了一个application jsonAPI Gateway 中的正文映射模板如下所示 input input params
  • 在 Mac 上正确运行基于 SWT 的跨平台 jar

    我一直致力于一个基于 SWT 的项目 该项目旨在部署为 Java Web Start 从而可以在多个平台上使用 到目前为止 我已经成功解决了由于 SWT 依赖的系统特定库而出现的导出问题 请参阅相关thread https stackove
  • 仅将 char[] 的一部分复制到 String 中

    我有一个数组 char ch 我的问题如下 如何将 ch 2 到 ch 7 的值合并到字符串中 我想在不循环 char 数组的情况下实现这一点 有什么建议么 感谢您花时间回答我的问题 Use new String value offset
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • 如何从终端运行处理应用程序

    我目前正在使用加工 http processing org对于一个小项目 但是我不喜欢它附带的文本编辑器 我使用 vim 编写所有代码 我找到了 pde 文件的位置 并且我一直在从 vim 中编辑它们 然后重新打开它们并运行它们 重新加载脚
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview

随机推荐

  • Rails 3 设计 401 未经授权的 ajax 调用

    我遇到了与这个问题类似的问题 Rails 3 中的 jQuery Ajax 调用收到 401 未经授权的请求 我已将 token authenticatable 添加到我的设计模型中 在我的 ajax 调用操作中 def rate para
  • 如何将列表应用于 pandas 组[重复]

    这个问题在这里已经有答案了 我看到这个问题 在 pandas groupby 中对列表中的行进行分组 但我想要应用两列以上list input df pd DataFrame index c1 c2 c3 1 A 6 1 2 A 5 2 3
  • 如何通过按键切换元素的内容?

    我目前正在尝试创建一个网站 如果我按 q p 标签将从 Q 更改为 A 目前 这适用于下面的代码 然而问题是 当按 q 时 它需要返回到 A 我尝试让它与removeEventListeners 一起使用 但它似乎不起作用 Like die
  • 如何递归地从表中删除项目?

    我有一个 MySQL 表 文件夹 CREATE TABLE IF NOT EXISTS folders id int 11 unsigned NOT NULL AUTO INCREMENT folder key varchar 40 NOT
  • sed:在块之后追加

    我对 sed 很陌生 我发现的所有内容都是这里一点 那里一点 我有一个文本文件 其中包含如下所示的块 start a b c whatever 显然 这是一个简化版本 我想在末尾添加一行 start阻止给我 start a b c d wh
  • 如何使用表中可能不可用的 ID 构建 SQL 语句?

    使用 Microsoft SQL Server 2008 假设有一个 table1 保存所选的省 区 公社和村庄的 ID 然后是表2 其中包含省 区 公社和村庄的ID和名称 省份和地区是必填字段 并且始终会被填满 公社和村庄可能会被填满 但
  • 使用 Apache Spark 将键值对简化为键列表对

    我正在编写一个 Spark 应用程序 想要组合一组键值对 K V1 K V2 K Vn 成一个键 多值对 K V1 V2 Vn 我觉得我应该能够使用reduceByKey带有某种味道的函数 My KMV My KV reduce lambd
  • NSString:isEqual 与 isEqualToString

    有什么区别isEqual and isEqualToString 为什么类要添加 isEqualTo 方法 对于 NSArray 来说是 isEqualToArray 对于 NSData 来说是 isEqualToData 而不是仅仅重写i
  • AFNetworking 表单请求(一个请求中上传多个文件)

    我们正在开发一个 iOS 应用程序 该应用程序在一个请求中提供单个以及多个文件上传选项 我使用 AFNetworking 进行单个文件上传 效果很好 现在 我们需要支持多个文件上传 我有 html 代码 它实际上可以从网络上传多个文件 我需
  • DISPID_VALUE 对于从脚本调用 IDispatch 是否可靠?

    继续从这个问题 我很困惑是否DISPID VALUE on IDispatch Invoke 脚本函数和属性 在我的例子中是 JavaScript 可以被认为是标准且可靠的 用于调用由IDispatch 如果是 MSDN 中是否提到过 请注
  • Java全屏独占模式

    我使应用程序在独占模式下全屏显示 但是当我显示输入对话框时 应用程序被最小化 我希望应用程序保持全屏 并在其上显示输入对话框 这就是我全屏渲染应用程序的方式 setUndecorated true GraphicsEnvironment g
  • CIPhotoEffect CIFilters 在色彩管理方面是不变的。是什么赋予了 CIPhotoEffect 滤镜这个属性?

    给这个问题一些背景 ho ho 我在 iOS 下对 CIFilter 进行子类化 以便创建一些自定义照片效果滤镜 根据文档 这意味着创建一个 复合 过滤器 将一个或多个预先存在的 CIFilter 封装在我的自定义 CIFilter 子类的
  • 如何让 iPhone 在播放视频时自动锁定

    如何允许 iOS 设备在使用 AVFoundation 播放视频时调暗屏幕并自动锁定设备 使用 AVPlayer 播放视频默认禁用屏幕自动锁定 无论如何 是否可以在不暂停视频播放的情况下重新启用它 为什么你想让屏幕在播放视频时处于空闲状态
  • C# 同时运行多个异步任务

    我对异步任务有点陌生 我有一个函数 可以获取学生 ID 并从特定大学网站上抓取具有所需 ID 的数据 private static HttpClient client new HttpClient public static async T
  • 如何使用从数据库派生的相对文件路径将 WPF 图像元素绑定到本地硬盘驱动器上的 PNG?

    我在本地硬盘上有一个文件夹 其中有几张图像 图像名称 路径存储在本地 SQLCE 数据库中 在 WPF 应用程序中 我尝试将这些图像绑定到 Image 元素 最终进入列表框 我已经运行和编译了应用程序 并且列表框显示出来 但没有图像应该在的
  • 错误:0909006C:PEM 例程:get_name:无起始行 - 适用于 heroku 中的谷歌云平台

    当我尝试使用 google cloud storage 时 它 返回此错误 Error error 0909006C PEM routines get name no start line 2021 12 13T10 36 19 80082
  • Apache Ivy:解决安装程序中嵌入的依赖关系

    我在构建时遇到问题 必须通过 Apache Ivy 解决非标准工件 Problem 我依赖于两个工件 a jar 和 a lib jar 这两个依赖项仅作为单个安装程序 a installer jar 的一部分 安装程序可以下载 但嵌入的工
  • 使用 Core Audio 获取麦克风输入和扬声器输出

    所以我最近研究了一些核心数据 但仍然是一个新手 我无法理解我正在访问哪些数据以及它如何影响整体数据流 因此 对于一些背景知识 我有一个使用 webRTC 在手机之间进行视频 音频流传输的应用程序 但是 我想检查通过麦克风输入设备的数据以及通
  • cUrl 不带 http://www 的域

    您好 我有一个域 我想用 cUrl 解析 情况如下 当我进入域时http register metsad ee avalik info teatis php too id 2942704201 它会将我重定向到 register metsa
  • 如何修复 Dagger 2 错误“...无法提供 [...]”?

    这是一个规范问题因为这是 Dagger 2 的一个常见错误 如果您的问题被标记为重复请仔细阅读这篇文章并确保了解此错误的含义以及发生的原因 如果这篇文章不适合您 请务必包含 where and how 您提供提到的课程并包括完整的错误消息在