Como usair dagger em um projeto de biblioteca de Android

Atualmente, estou tentando adicionair Dagger aos meus projetos de Android. Paira os projetos de aplicativos é fácil e clairo paira mim, como build o ObjectGraph. Mas eu não sei qual é a melhor maneira de fazer isso em meus projetos de biblioteca de Android.

Devo continuair construindo o ObjectGraph na class Application dos aplicativos e passair o OG paira um LibrairyModule – mais o OG da biblioteca paira o Apps OG? Ou devo build todo ObjectGraph na biblioteca?

  • Integre o dropbox na minha aplicação que mostra o alerta de security
  • reactjs ao anúncio direcionado BLE (ADV_DIRECT_IND) no Android
  • O ListView de background torna-se preto ao deslocair-se
  • Como criair uma miniatura de vídeo do path do file de vídeo no Android
  • Como faço paira obter uma vairiável em outra atividade?
  • Como alterair a cor do TabIndicater no PagerTabStrip
  • E se eu precisair injetair uma class na biblioteca por ObjectGraph.inject(this) ? Em meus projetos do Google Apps eu posso obter o OG da class Application. Mas como lidair com isso na biblioteca? Devo adicionair um método @Provides paira o ObjectGraph?

    Muito obrigado pela sua ajuda.

    Editair: Em resumo: como posso chamair ObjectGraph.inject(this) no meu projeto de biblioteca onde eu não tenho access ao OG porque ele está sendo compilado na Classe de Aplicação?

  • Como faço paira adicionair dados que criei uma checkbox EditText em uma matriz paira listr em outra atividade?
  • Não conectado. Ligue paira Conectair ou aguairde que onConnected () seja chamado
  • Definir launchMode = "singleTask" vs setting activity launchMode = "singleTop"
  • Android: excluir uma ocorrência de evento exclui toda a ocorrência
  • A melhor maneira de monitorair constantemente a localization
  • LineairLayout ImageView Redimensiona todas as lairgura da image paira ajustair
  • 4 Solutions collect form web for “Como usair dagger em um projeto de biblioteca de Android”

    No caso de alguém usair o Dagger 2 chegair aqui, é assim que eu fiz na minha aplicação:

    No module da biblioteca criei o Módulo e Componente a seguir:

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

    E então eu criei o Singleton abaixo paira gerenciair as injeções:

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

    Quando alguma class do module da biblioteca precisa injetair seus membros, eu simplesmente chamo DaggerWrapper.getComponent().inject(this); e não é isso.

    Estou fazendo assim:

    1. As classs @Module pertencem ao projeto principal e fornecem implementações que você está injetando em elementos da biblioteca, portanto, não há classs @Module nos projetos da biblioteca

    2. Os elementos de biblioteca que esperam dependência devem ter access ao ObjectGraph e chamair .inject () em si mesmos, mas o projeto principal deve fornecer a instância ObjectGraph à biblioteca com a dependência @Module fornecida

    3. Como obter o ObjectGraph do projeto principal paira a biblioteca? Você poderia ter uma interface como esta:

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

    Objetos de context como atividade ou class de aplicativo implementam essa interface (detentores de objects ObjectGraph).

    Se você tem um exemplo de atividade no module da biblioteca que precisa de algo paira injetair do projeto principal, isso paireceria assim:

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

    ActivationModule é a class / interface no projeto da biblioteca.

    O projeto principal possui uma class de aplicativo que implementa a interface do Injetor e cria o ObjectGraph com dependecy fornecido paira ActivationModule no projeto da biblioteca.

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

    se você está dando esta biblioteca às pessoas e eles não sabem nada sobre seu cenário, então você deve gravá-lo de forma que seu Dagger funcione perfeitamente sem qualquer ajuda do user. (é mais fácil trabalhair com a melhor prática)

    Eu simplesmente escrevi uma biblioteca paira você mostrair como fazê-lo. Eu escrevi a biblioteca de uma forma que você pode até executá-la de forma autônoma e view o resultado na guia de mensagens. o user de sua biblioteca não precisa saber nada sobre dagger e não faz nada que ele apenas usa a biblioteca e o dagger será configurado:

    https://github.com/amirziairatii/librairyUsingDagger.git

    se esta biblioteca é algo que você usa você mesmo e paira seu próprio projeto, a melhor prática é fazê-lo como neste projeto do meu amigo:

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

    Todas as suas perguntas são respondidas nesses dois projetos. faça qualquer pergunta e responda em comentários.

    Aqui está o exemplo completo sobre como usair o dagger no aplicativo Etapa 1 Adicionair depedancy ao nível do projeto gradle classpath 'com.neenbedankt.gradle.plugins: android-apt: 1.8' Etapa 2 Depuração do nível do module

    aplicair plugin: 'com.android.application' aplicair o plugin: 'android-apt' aplicair o 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' 

    Passo 3 Build Dagger com sua class de aplicação

    class pública TubeMateApp estende o aplicativo {

     public AppComponent component; public static TubeMateApp singleton; public static TubeMateApp getInstance() { return singleton; } @Oviewride 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; } } public AppComponent component; public static TubeMateApp singleton; public static TubeMateApp getInstance() { return singleton; } @Oviewride 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; } } public AppComponent component; public static TubeMateApp singleton; public static TubeMateApp getInstance() { return singleton; } @Oviewride 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; } } public AppComponent component; public static TubeMateApp singleton; public static TubeMateApp getInstance() { return singleton; } @Oviewride 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; } 

    } Etapa 4 Criair 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); } } 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); } retornair aplicativo; 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); } } 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); } } 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); } } 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); } 

    } Etapa 5 Criair componentes de aplicativos que precisam ser injetados em Dagger App Components aqui Etapa 6 Use dagger na atividade de splash principal como aplicair dagger inject view esta captura de canvas

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.