Java 如何修复Dagger 2错误';。。。无法提供[…]和#x27;?
这是一个错误,因为这是匕首2的常见错误 如果您的问题被标记为重复,请仔细阅读此帖子,并确保理解此错误的含义以及发生的原因。如果这篇文章不适合您,请确保包括您在何处以及如何提供所提到的类,并在您的问题中包括完整的错误消息,如此处所示 我尝试使用Dagger 2的依赖项,但在尝试编译项目时收到以下错误: 错误:com.example.MyDependency不能在没有@Inject构造函数或@Provides注释方法的情况下提供 com.example.MyDependency在Java 如何修复Dagger 2错误';。。。无法提供[…]和#x27;?,java,dagger-2,Java,Dagger 2,这是一个错误,因为这是匕首2的常见错误 如果您的问题被标记为重复,请仔细阅读此帖子,并确保理解此错误的含义以及发生的原因。如果这篇文章不适合您,请确保包括您在何处以及如何提供所提到的类,并在您的问题中包括完整的错误消息,如此处所示 我尝试使用Dagger 2的依赖项,但在尝试编译项目时收到以下错误: 错误:com.example.MyDependency不能在没有@Inject构造函数或@Provides注释方法的情况下提供 com.example.MyDependency在 com.examp
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),以及Dagger尝试注射的位置(b)。它还告诉您该依赖类是在何处创建的(c),以及无法提供(a)的组件(d) com.example.MyDependency不能在没有@Inject构造函数或@Provides注释方法的情况下提供。
com.example.MyDependency(a)在
com.example.DependentClass.(依赖项)(b)
com.example.DependentClass在(c)
com.example.MyComponent.myDependency()(d) 同样的道理也适用于这里:确保(d)知道如何提供(a),这样你就可以开始了 我该如何解决这个问题? 请查看如上所示的错误。确保您了解它发生的位置以及您尝试注入的内容。然后告诉Dagger如何提供你的物品 @Inject构造函数 如错误所述,您尝试使用
MyDependency
,但MyComponent
不知道如何使用。如果我们看一看这个例子,就会明白为什么:
class MyDependency {}
该类没有@Inject
注释的构造函数!而且组件中没有其他模块,所以Dagger也无能为力
如果您想使用构造函数注入,只需添加一个带注释的构造函数即可。Dagger将看到这个构造函数并知道如何创建类
class MyDependency {
@Inject
MyDependency() { /**/ }
}
当您可以使用构造函数注入时,这就是您所要做的一切
来自@Provides注释的方法
错误消息说明了第二个选项,该选项允许您在不希望或无法使用构造函数注入时提供对象。您还可以将@提供的注释方法添加到模块中,并将此模块添加到组件中
@Module
class MyModule {
@Provides
MyDependency provideMyDependency() {
return new MyDependency();
}
}
@Component(modules = MyModule.class)
interface MyComponent {
MyDependency myDependency();
}
通过这种方式,Dagger可以使用您的模块来创建和提供依赖关系。与使用构造函数注入相比,它更具样板性,但对于需要进一步设置或没有带注释的构造函数的所有内容,您都必须使用模块,例如,第三方库,如翻新、OkHttp或Gson
还有其他方法可以从组件提供依赖关系。@SubComponent
可以访问其父依赖项,组件依赖项可以将其某些依赖项公开给其依赖组件。但在某些情况下,Dagger提供的一切都需要一个@Inject
构造函数或一个提供它的模块
但我确实添加了MyDependency
!
请密切关注细节。当您仅提供实现时,可能正在使用接口,或者当Dagger只知道子类时,尝试使用父类。
可能您添加了一个自定义的@限定符
,或者使用了名为(“typeA”)的@限定符
。匕首这是一个完全不同的对象!仔细检查您是否实际提供和请求了相同的依赖项
阅读错误并确保您有一个@Inject
带注释的构造函数、一个具有@提供该类型的方法的模块,或者一个提供该类型的父组件
如果我想为我的接口提供一个实现呢?
下面的简单示例显示了一个类如何扩展另一个类:
class MyDependency extends MyBaseDependency {
@Inject MyDependency() { super(); }
}
这将通知Dagger有关MyDependency
,的信息,但不会通知Dagger有关MyBaseDependency
如果有一个类实现了一个接口或扩展了一个超类,那么必须声明它。如果您提供了MyDependency
,这并不意味着Dagger可以提供MyBaseDependency
。YouC
@Module
interface MyModule {
@Binds
MyBaseDependency provideMyBaseDependency(MyDependency implementation);
}