这是一个典型的问题,因为这是用匕首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();
}
文艺青年最爱的你忘到任何一个添加@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)知道如何提供(一)和你去好。
看一看错误如上图所示。确保你了解那里它发生和什么你试图注入。然后告诉匕首如何提供你的对象。
由于错误状态,您尝试使用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] 删除。
我来说两句