Dagger 2 error: dependency "no se puede proporcionar sin un constructor @Inject"

Estoy tratando de usar Dagger 2 en mi proyecto de Android. Para empezar, quiero hacer uso de dos componentes responsables de inyectar dependencias de toda la aplicación y de toda la actividad, respectivamente. Como referencia básica, entre otras cosas utilicé esta respuesta .

Así que hay dos formas diferentes de establecer la relación entre los componentes: con la anotación @Subcomponent y con el parámetro dependencies .

  1. Si voy con el primero, mi AppContextComponent funciona bien. Pero tan pronto como intento inyectar la dependencia del ActivityContextComponent , consigo este error de la generación-tiempo:

Error: com.example.ui.activity.MainActivity no se puede proporcionar sin un constructor @Inject o desde un método @ Provides o @ Produces-annotated.

  1. Con el segundo enfoque, obtengo este error para todas las dependencias.

Sabiendo que tengo métodos de provisión, este mensaje de error es francamente inútil. Aquí hay un par de otras fuentes posibles de este error que he manejado a google pero no parecen ser el caso:

  1. Problemas de alcance .
  2. Ambuiguidad debido al mismo tipo de retorno de diferentes métodos de provisión (el problema persiste incluso si elimino métodos que proporcionan Context ).

El siguiente código está en Kotlin, pero creo que debería ser bastante sencillo.

Componente de aplicación

 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; } } 

Componente de actividad

 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; } } 

Y a continuación se muestra cómo se utilizan estos componentes.

Solicitud

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

Actividad

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

BaseFragment (donde ocurre la inyección real)

 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) } } 

¿Qué me estoy perdiendo?

¡Gracias!

EDITAR

La esencia es:

Si usa @Subcomponent s de @Subcomponent , asegúrese de que no tiene un método en el @Component padre que se inyecta en la misma clase de destino que su subcomponente.

Dagger se confunde y tratará de generar código para inyectar en el objetivo directamente desde el componente padre, mientras que no tiene los módulos necesarios para satisfacer la dependencia inyectada.

  • ¿Cómo puedo ejecutar una única prueba de Android con Kotlin?
  • Error: Error de ejecución de la tarea ': app: compileDebugKotlin'. > Error de compilación. Ver registro para más detalles
  • Kotlin: @ propiedades ignoradas persistidas por Sugar ORM
  • Android: Kotlin con Butterknife
  • Objetos complementarios en las interfaces Kotlin
  • CompileKotlin bloquea en archivo build.gradle lanza error "No se pudo encontrar el método compileKotlin () para los argumentos "
  • La llamada a API no funciona dentro de Anko Async
  • La mejor manera de combinar banderas enteras con Kotlin?
  • Mejora del análisis de Java / Kotlin JSON
  • Sala de pruebas de unidad y LiveData
  • Experimental JUnit apoyo en Android + Kotlin no funciona
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.