number marvel last google daggerfragment compiler avion annotationprocessor java android dagger

java - marvel - Utilice los módulos Dagger sin la directiva de "inyectar"



dagger marvel (1)

Usted quiere

@Module(library=true)

Esto es lo que dicen los documentos sobre la library :

Falso si todos los enlaces incluidos en este módulo son necesarios para satisfacer todos sus tipos inyectables. Si un módulo no es un módulo de biblioteca, es elegible para una verificación estática adicional: las herramientas pueden detectar si los enlaces incluidos no son necesarios. Si proporciona enlaces que no se utilizan en el gráfico de este módulo, debe declarar library = true.

(énfasis mío)

Declarar un módulo como una biblioteca no alivia las necesidades de Dagger para conocer los puntos de inyección. Aún debe declarar un módulo en el gráfico de objeto con las inyecciones enumeradas.

Una versión extrema simplificada de tu ejemplo se vería así:

repo/ +- library/ | +- Foo.java | `- FooModule.java | `- app/ +- BarActivity.java `- BarModule.java

FooModule.java :

@Module(library = true) public final class FooModule { @Provides @Singleton provideFoo() { return Foo(); } }

BarModule.java :

@Module( injects = BarActivity.class, includes = FooModule.class ) public final class BarModule { }

En BarActivity.java (o similar):

ObjectGraph og = ObjectGraph.create(new BarModule()); og.inject(this);

Estoy tratando de hacer que Dagger funcione sin la directiva "inyecta" dentro de la anotación @Module. Estoy basando mi proyecto de prueba en el ejemplo de Android Daga Simple

Esta es la parte que me está dando problemas:

@Module( injects = HomeActivity.class, complete = false ) public class DemoModule { // TODO put your application-specific providers here! }

(Editar): que en mi código es CTXModules.java

La parte que me gustaría eliminar es "injects = HomeActivity.class". Sé que puedo marcar mis propios módulos con la anotación @Inject en el constructor para eliminar esa parte allí, pero de alguna manera no funciona con el módulo que se agrega al gráfico. Con esa línea allí, todo funciona bien.

La razón por la que necesito esto es porque dagger se implementará en un proyecto de biblioteca base que será la base de algunos proyectos que comparten una base de código común y, por lo tanto, en el momento o la escritura de esta parte del código, no sé qué Las clases inyectarán módulos.

¿Es lo que estoy tratando de hacer incluso posible?

Supongo que es posible porque la clase del módulo de Android no usa esa directiva.

Espero que esté lo suficientemente claro. ¡Gracias por adelantado!

(EDITAR)

Debería haberlo mencionado. En mi módulo quito "injects = HomeActivity.class" y agrego "library = true" como en la clase del Módulo Android . Lo que sucede entonces es que recibo este error (mi error no lo he agregado antes):

12-10 09:21:16.807: E/AndroidRuntime(21783): FATAL EXCEPTION: main 12-10 09:21:16.807: E/AndroidRuntime(21783): Process: com.ef.daggertestproject, PID: 21783 12-10 09:21:16.807: E/AndroidRuntime(21783): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ef.daggertestproject/com.ef.daggertestproject.MainActivity}: java.lang.IllegalArgumentException: No inject registered for members/com.ef.daggertestproject.MainActivity. You must explicitly add it to the ''injects'' option in one of your modules. 12-10 09:21:16.807: E/AndroidRuntime(21783): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2176) 12-10 09:21:16.807: E/AndroidRuntime(21783): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2226) 12-10 09:21:16.807: E/AndroidRuntime(21783): at android.app.ActivityThread.access$700(ActivityThread.java:135) 12-10 09:21:16.807: E/AndroidRuntime(21783): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397) 12-10 09:21:16.807: E/AndroidRuntime(21783): at android.os.Handler.dispatchMessage(Handler.java:102) 12-10 09:21:16.807: E/AndroidRuntime(21783): at android.os.Looper.loop(Looper.java:137) 12-10 09:21:16.807: E/AndroidRuntime(21783): at android.app.ActivityThread.main(ActivityThread.java:4998) 12-10 09:21:16.807: E/AndroidRuntime(21783): at java.lang.reflect.Method.invokeNative(Native Method) 12-10 09:21:16.807: E/AndroidRuntime(21783): at java.lang.reflect.Method.invoke(Method.java:515) 12-10 09:21:16.807: E/AndroidRuntime(21783): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777) 12-10 09:21:16.807: E/AndroidRuntime(21783): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593) 12-10 09:21:16.807: E/AndroidRuntime(21783): at dalvik.system.NativeStart.main(Native Method) 12-10 09:21:16.807: E/AndroidRuntime(21783): Caused by: java.lang.IllegalArgumentException: No inject registered for members/com.ef.daggertestproject.MainActivity. You must explicitly add it to the ''injects'' option in one of your modules. 12-10 09:21:16.807: E/AndroidRuntime(21783): at dagger.ObjectGraph$DaggerObjectGraph.getInjectableTypeBinding(ObjectGraph.java:281) 12-10 09:21:16.807: E/AndroidRuntime(21783): at dagger.ObjectGraph$DaggerObjectGraph.inject(ObjectGraph.java:258) 12-10 09:21:16.807: E/AndroidRuntime(21783): at com.ef.daggertestproject.MyApplication.inject(MyApplication.java:47) 12-10 09:21:16.807: E/AndroidRuntime(21783): at com.ef.daggertestproject.BaseActivity.onCreate(BaseActivity.java:27) 12-10 09:21:16.807: E/AndroidRuntime(21783): at com.ef.daggertestproject.MainActivity.onCreate(MainActivity.java:16) 12-10 09:21:16.807: E/AndroidRuntime(21783): at android.app.Activity.performCreate(Activity.java:5243) 12-10 09:21:16.807: E/AndroidRuntime(21783): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 12-10 09:21:16.807: E/AndroidRuntime(21783): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2140) 12-10 09:21:16.807: E/AndroidRuntime(21783): ... 11 more

Además, he subido mi proyecto de prueba a github

(Edición final) según la respuesta de Jake: "Declarar un módulo como una biblioteca no alivia las necesidades de Dagger para conocer los puntos de inyección". Y por lo tanto, la respuesta a mi pregunta original es que no es posible.