Ошибка кинжала 2: зависимость "не может быть предоставлена ​​без конструктора @Inject"

Я пытаюсь использовать Dagger 2 в своем проекте Android. Во-первых, я хочу использовать два компонента, ответственных за инъекцию зависимостей в масштабах приложения и всей области, соответственно. В качестве базовой ссылки, среди прочего, я использовал этот ответ .

Таким образом, существует два разных способа настройки отношения между компонентами: с аннотацией @Subcomponent и параметром dependencies .

  1. Если я пойду с первым, мой AppContextComponent отлично работает. Но как только я пытаюсь ввести зависимость от ActivityContextComponent , я получаю эту ошибку времени сборки:

Ошибка: com.example.ui.activity.MainActivity не может быть предоставлена ​​без конструктора @Inject или из метода @ Provides- или @ Produces-annotated.

  1. Со вторым подходом я получаю эту ошибку для всех зависимостей.

Зная, что у меня есть методы предоставления, это сообщение об ошибке откровенно бесполезно. Вот несколько других возможных источников этой ошибки, с которыми мне удалось разобраться, но они, похоже, не так:

  1. Проблемы определения .
  2. Неожиданность из-за того же типа возврата из разных методов предоставления (проблема сохраняется, даже если я удаляю методы, обеспечивающие Context ).

Следующий код находится в Котлине, но я считаю, что это должно быть довольно просто.

Компонент приложения

 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 s @Subcomponent , убедитесь, что у вас нет метода в родительском @Component который вводит в тот же целевой класс, что и ваш подкомпонент.

Кинжал запутается и попытается сгенерировать код для инъекции в цель непосредственно из родительского компонента, в то время как у него нет необходимого модуля (модулей) для удовлетворения вложенной зависимости.