如何解决匕首2错误“......无法提供[...]”?

大卫Medenjak:

这是一个典型的问题,因为这是用匕首2常见的错误。

如果您的问题被标记为重复,请仔细阅读这篇文章,并确保理解这个错误是什么手段,它为什么发生。如果这个帖子不工作,你一定要包括地方如何您提供提到的类,并包括完整的错误消息,在最后的一个你的问题。

我试图用一个依赖与匕首2,但我收到以下错误,当我尝试编译我的项目:

错误: com。示例。MyDependency不能没有一个@Inject构造或从@提供注解方法来提供。

com。示例。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();
}
大卫Medenjak:

文艺青年最爱的你忘到任何一个添加@Inject到您的构造函数,以便匕首可以使用构造器注入到提供对象,或者你需要一些方法在你的模块创建或绑定对象之一。


这是怎么回事?

有一个很好看的错误消息:据指出您尝试请求的依赖,但匕首有没有办法提供或创造它它根本就不知道怎么样了,因为它不能没有一个@Inject构造函数或从@提供注解的方法来提供。

在错误消息显示近距离观察类(A)您试图提供和成分(B)需要它。

com.example.MyDependency 的(a)在被提供
com.example.MyComponent.myDependency()(b)中

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

它看起来有点更复杂,如果你想注入你的依赖别的地方,但你仍然可以看到的事件,在这种情况下,构造函数注入缺少的依赖完整的堆栈。(A)您试图提供与位置(B) 其中匕首试图将其注入。它还告诉你哪里是创建依赖类(C),再与组分(d)未能提供(一)

不能在没有一个@Inject构造或从提供com.example.MyDependency @提供注解方法。
com.example.MyDependency (a)中,在被注入
com.example.DependentClass。(依赖性)(b)中
com.example.DependentClass是设置在(c)中
com.example.MyComponent.myDependency()(d)

这同样适用于这里:确保(d)知道如何提供(一)和你去好。

我该如何解决?

看一看错误如上图所示。确保你了解那里它发生和什么你试图注入。然后告诉匕首如何提供你的对象。

一个@Inject构造

由于错误状态,您尝试使用MyDependency,但MyComponent不知道该怎么做。如果我们看一下例子就变得很清楚,为什么:

class MyDependency {}

该类有没有@Inject注释的构造并且在该组件没有其他的模块,所以没有什么匕首可以做。

如果您想使用构造函数注入你可以添加@Inject注释构造函数和完成。匕首会看到这样的构造,并且知道如何创建类。

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

这就是你需要做的,当你可以使用构造器注入的。

从@提供注解方法

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

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

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

这样匕首可以用你的模块来创建并提供你的依赖。它是一点点更多的样板比使用构造器注入,但你将不得不使用模块需要进一步的设置或不具有注释的构造函数的一切,如第三方库,例如改装,OkHttp,或GSON。


还有其他的方法来提供从组件的依赖。一个@SubComponent访问其父母的依赖,并且组件相关可以公开一些依赖于它的相关组件。但在某些时候一切匕首提供需要要么有一个@Inject构造函数或模块提供它。

但我确实添加了MyDependency

狠抓细节。你可能是使用接口时,你只提供了实现,或者尝试使用父类,当匕首只知道子类。
也许你添加自定义@Qualifier或使用@Named("typeA")它。为了匕首,这是一个完全不同的对象!仔细检查你实际提供和要求相同的依赖。

读取错误,并确保你要么有一个@Inject注释构造,具有模块@Provides该方法提供了类型,或做一个父组件。

如果我想要什么为我的接口的实现?

一个简单的例子,如以下示出了如何一个类继承另一个:

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

这将通知匕首有关MyDependency但不是MyBaseDependency

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

@Module
interface MyModule {
    @Binds
    MyBaseDependency provideMyBaseDependency(MyDependency implementation);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

匕首2:错误:[Dagger / MissingBinding]无法解决此问题

无法提供匕首改装

如何解决错误“命名管道提供程序,错误40-无法打开与'SQL Server'的连接”?

如何解决“无法更改常量”错误

匕首无法提供Kotlin的注射

如何解决“离散值提供给连续刻度” ggplot2中的错误

如何解决错误eval:2:0:提供:不在模块级别

如何解决“无法解决groupBy”错误消息?

错误:无法解决:viewpager-如何解决?

如何解决Vue-Formulate无法解决组件错误

如何解决git的“无法合并的错误”错误

如何解决Unity中的“无法从复合读取类型为Vector2的值”错误?

如何解决Safaricom C2B错误“无法识别主机代理”

如何解决“无法为环境生产解析”错误?

如何解决MySql“无法执行此命令”错误?

如何解决无法加载此类文件openssl错误?

如何解决此“无法读取null的属性'appendChild'”错误?

如何解决:错误:无法处理清单

如何解决错误消息:“无法映射路径'/'。”

如何解决我的“无法解析符号” java错误?

如何解决XStartTimeoutError:无法启动显示“:1013”的X错误

如何解决此错误VFY:无法解析虚拟方法

如何解决“预期表达”和“无法推断参数”错误?

如何解决Safari 10.1错误“无法发送WebSocket框架”?

开玩笑的错误:测试套件无法运行,如何解决?

如何解决无法读取空错误的属性“值”?

如何解决打字稿中的“无法分配”错误?

如何解决错误消息“无法识别USB设备”?

如何解决MediaPlayer错误“无法播放此视频”