Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何修复Dagger 2错误';。。。无法提供[…]和#x27;?_Java_Dagger 2 - Fatal编程技术网

Java 如何修复Dagger 2错误';。。。无法提供[…]和#x27;?

Java 如何修复Dagger 2错误';。。。无法提供[…]和#x27;?,java,dagger-2,Java,Dagger 2,这是一个错误,因为这是匕首2的常见错误 如果您的问题被标记为重复,请仔细阅读此帖子,并确保理解此错误的含义以及发生的原因。如果这篇文章不适合您,请确保包括您在何处以及如何提供所提到的类,并在您的问题中包括完整的错误消息,如此处所示 我尝试使用Dagger 2的依赖项,但在尝试编译项目时收到以下错误: 错误:com.example.MyDependency不能在没有@Inject构造函数或@Provides注释方法的情况下提供 com.example.MyDependency在 com.examp

这是一个错误,因为这是匕首2的常见错误

如果您的问题被标记为重复,请仔细阅读此帖子,并确保理解此错误的含义以及发生的原因。如果这篇文章不适合您,请确保包括您在何处以及如何提供所提到的类,并在您的问题中包括完整的错误消息,如此处所示

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

错误:com.example.MyDependency不能在没有@Inject构造函数或@Provides注释方法的情况下提供

com.example.MyDependency在
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);
}