匕首2错误:依赖“不能提供没有@Inject构造函数”

我试图在我的Android项目中使用Dagger 2。 对于初学者,我想利用两个组件分别负责注入应用程序范围和活动范围的依赖关系。 作为一个基本的参考,我使用了这个答案 。

所以有两种不同的方式来设置组件之间的关系:使用@Subcomponent注解和dependencies参数。

  1. 如果我去第一个,我的AppContextComponent工作正常。 但只要我尝试从ActivityContextComponent注入依赖项,我得到这个生成时间错误:

错误:com.example.ui.activity.MainActivity不能提供@Inject构造函数或@提供 – 或@ Produces注释的方法。

  1. 第二种方法,我得到这个错误的所有依赖。

知道我有提供方法,这个错误信息是坦率地没有用。 这里有一些其他可能的来源,我已经设法谷歌这个错误,但他们似乎并非如此:

  1. 范围问题 。
  2. 由于来自不同提供方法的返回类型相同而引起歧义 (即使删除提供Context 方法 ,问题仍然存在)。

下面的代码是在Kotlin中,但我认为它应该是非常简单的。

应用程序组件

 object AppContext { // a singleton used in place of a Java static field @JvmStatic lateinit var graph: AppContextComponent } @ApplicationScope @Component(modules = arrayOf(AppContextModule::class)) interface AppContextComponent { fun inject(fragment: BaseFragment) fun newActivityContextComponent(module: ActivityContextModule): ActivityContextComponent } @Module class AppContextModule(val app: MyApplication) { @Provides @ApplicationScope @ForApplication fun provideContext(): Context { return app; } @Provides @ApplicationScope fun provideMyApplicationContext(): MyApplication { return app; } } 

活动组件

 object ActivityContext { @JvmStatic lateinit var graph: ActivityContextComponent } @ActivityScope @Subcomponent(modules = arrayOf(ActivityContextModule::class)) interface ActivityContextComponent { fun inject(fragment: BaseFragment) } @Module class ActivityContextModule(val activity: MainActivity) { // Worth pointing out is that the provision methods are not used. // That is, no code is being generated for them. @Provides @ActivityScope @ForActivity fun provideContext(): Context { return activity; } @Provides @ActivityScope fun provideMainActivityContext(): MainActivity { return activity; } } 

以下是如何使用这些组件。

应用

 class MyApplication : SugarApp() { override fun onCreate() { super.onCreate() AppContext.graph = DaggerAppContextComponent .builder() .appContextModule(AppContextModule(this)) .build() } } 

活动

 class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) ActivityContext.graph = AppContext.graph .newActivityContextComponent(ActivityContextModule(this)) } } 

BaseFragment (实际注入发生的地方)

 abstract class BaseFragment : Fragment() { // works fine @Inject @ForApplication lateinit var myApplication: MyApplication // fails with "cannot be provided" error @Inject @ForActivity lateinit var myActivity: MainActivity override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) ActivityContext.graph.inject(this) } } 

我错过了什么?

谢谢!

编辑

要点是:

如果使用匕首的@Subcomponent ,请确保在父组件的注入目标类不像您的子组件那样有一个方法。

匕首会感到困惑,并会尝试生成代码直接从父组件注入到目标中,而没有所需的模块来满足注入的依赖。