Cómo usar daga en un proyecto de biblioteca de Android

Actualmente estoy intentando agregar Dagger a mis proyectos de Android. Para los proyectos de aplicaciones es fácil y claro para mí, cómo construir el ObjectGraph. Pero no sé muy bien cuál es la mejor manera de hacer esto en mis proyectos de biblioteca de Android.

¿Debo seguir construyendo ObjectGraph en la clase Application de las aplicaciones y pasar el OG a un LibraryModule – además de la OG de la biblioteca a Apps OG? ¿O debo construir toda la ObjectGraph en la biblioteca?

¿Qué pasa si necesito inyectar una clase en la biblioteca por ObjectGraph.inject(this) ? En mis proyectos de Apps, puedo obtener el OG de la clase Application. Pero, ¿cómo manejar esto en la biblioteca? ¿Debo añadir un método @Provides para ObjectGraph?

Muchas gracias por tu ayuda.

Edit: En resumen: ¿Cómo puedo llamar a ObjectGraph.inject(this) en mi proyecto de biblioteca donde no tengo acceso a la OG porque está siendo construido en la clase de aplicación?

En caso de que alguien que use Dagger 2 llegue aquí, esta es la manera que he hecho en mi aplicación:

En el módulo de biblioteca he creado el siguiente Módulo y Componente:

 @Module public class ModuleUtil { @Provides public RestTemplate provideRestTemplate() { return new RestTemplate(); } } @Singleton @Component( modules = { ModuleUtil.class }) public interface MainComponent { void inject(Postman postman); } 

Y luego he creado el Singleton a continuación para gestionar las inyecciones:

 public class DaggerWrapper { private static MainComponent mComponent; public static MainComponent getComponent() { if (mComponent == null) { initComponent(); } return mComponent; } private static void initComponent () { mComponent = DaggerMainComponent .builder() .utilModule(new ModuleUtil()) .build(); } } 

Cuando alguna clase del módulo de biblioteca necesita inyectar a sus miembros, simplemente llamo DaggerWrapper.getComponent().inject(this); Y eso es todo.

Estoy haciendo de esta manera:

  1. Las clases @Module pertenecen al proyecto principal y proporcionan implementaciones que se están inyectando a los elementos de la biblioteca, por lo que no hay clases @Module en los proyectos de la biblioteca

  2. Los elementos de la biblioteca que esperan dependencia deben tener acceso a ObjectGraph y llamar .inject () sobre ellos mismos, pero el proyecto principal debe dar ObjectGraph instancia a la biblioteca con la dependencia @Module proporcionada

  3. Cómo obtener ObjectGraph desde el proyecto principal en la biblioteca? Usted podría tener interfaz como este:

     interface Injector { void inject(Object object); public ObjectGraph getObjectGraph(); } 

Objetos de contexto como Actividad o Clase de aplicación implementan esta interfaz (titulares de objetos ObjectGraph).

Si tiene ejemplo de Actividad en el módulo de biblioteca que necesita algo para inyectarse desde el proyecto principal, se vería así:

 class LibraryActivity extends Activity { @Inject ActivationModule instance; void onCreate(... ) { Injector injector = (Injector)getApplicationContext(); injector.inject(this) } } 

ActivationModule es la clase / interfaz en el proyecto de biblioteca.

El proyecto principal tiene una clase de aplicación que implementa la interfaz del Inyector y crea ObjectGraph con dependecy proporcionado para ActivationModule en el proyecto de la biblioteca.

 class MyApplicationInTheMainProject extends Application implements Injector { ObjectGraph graph; @Override public void onCreate() { super.onCreate(); graph = ObjectGraph.create(new ActivationModuleImpl(this)); } @Override public void inject(Object object) { graph.inject(object); } @Override public ObjectGraph getObjectGraph() { return graph; } } @Module(injects = { LibraryActivity.class }, library = true) class ActivationModuleImpl implements ActivationModule { .... } 

Si usted está dando esta biblioteca a la gente y no saben nada sobre su escenario por lo que debe escribir de una manera que su Daga funciona perfectamente sin ninguna ayuda del usuario. (El más fácil de trabajar con la mejor práctica)

Acabo de escribir una biblioteca para que usted muestre cómo hacerlo. Escribí la biblioteca de una manera que usted puede incluso funcionarla independiente y ver el resultado en la lengüeta de los mensajes. Usuario de tu biblioteca no necesita saber nada de daga y no hace nada que solo usa la biblioteca y la daga se configurará:

https://github.com/amirziaratii/libraryUsingDagger.git

Si esta biblioteca es algo que usas tú mismo y para tu propio proyecto, la mejor práctica es hacerlo como en este proyecto de mi amigo:

https://github.com/mmirhoseini/trakt.tv

Todas sus preguntas son contestadas en estos dos proyectos. Hacer cualquier pregunta y mala respuesta en el comentario.

Aquí está el ejemplo completo de cómo usar daga con en la aplicación Paso 1 Añadir depedencia a nivel de proyecto gradle classpath 'com.neenbedankt.gradle.plugins: android-apt: 1.8' Paso 2 Módulo de nivel depedencia

Aplicar plugin: 'com.android.application' aplicar plugin: 'android-apt' aplicar plugin: 'com.neenbedankt.android-apt'

 compile 'com.google.dagger:dagger:2.0' provided 'com.google.dagger:dagger-compiler:2.0' provided 'org.glassfish:javax.annotation:10.0-b28' 

Paso 3 Construye Dagger con tu clase de aplicación

Public class TubeMateApp extends Aplicación {

 public AppComponent component; public static TubeMateApp singleton; public static TubeMateApp getInstance() { return singleton; } @Override public void onCreate() { super.onCreate(); singleton = this; setupGraph(); } private void setupGraph() { component = DaggerAppComponent.builder() .appModule(new AppModule(this)) .build(); component.inject(this); } public AppComponent component() { return component; } 

} Paso 4 Crear AppModule como este

@Module public class AppModule {

 private TubeMateApp app; public AppModule(TubeMateApp application) { this.app = application; } @Provides public Application provideApplication() { return app; } @Provides @Singleton Prefs prefs(){ return Prefs.with(app); } // To use your custom requirement code here for example i have used Picasso with in the application @Provides @Singleton Picasso getPicasso(){ return Picasso.with(app); } @Provides @Singleton LayoutInflater getLayoutInflater() { return (LayoutInflater) app.getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); } 

} Paso 5 Crear componentes de aplicación que es necesario inyectar dagger Componentes de la aplicación aquí Paso 6 Usar daga en la actividad principal de salpicadura cómo aplicar daga inyectar ver esta captura de pantalla

  • Java: Diferentes resultados al decodificar cadena base64 con java.util.Base64 vs android.util.Base64
  • GCM de Android InstanceId.getToken () -> java.io.IOException: TIMEOUT
  • Cuál es la mejor aproximación para enviar grandes paquetes UDP en secuencia
  • Sustitución de recursos en tiempo de ejecución
  • La conversión al formato de Dalvik falló: No se puede ejecutar dex: Java heap space
  • Precargar algunas imágenes para listview con UniversalImageLoader
  • Visualización del archivo de forma o del archivo OSM en android como mapa
  • Java Java FATAL EXCEPTION java.lang.NullPointerException
  • La forma más rápida y fácil de encontrar métodos en Java / Android que tardan un segundo o más en ejecutarse
  • Bajo qué OS es Eclipse más robusto?
  • Dagger 2 "Dagger" prefijo componente no es capaz de compilar? Clase generada automáticamente
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.