google - inject class android
Daga 2 componente no generado (6)
¿Quizás olvidó anotar ModuleClass con @Module?
En mi módulo, en mi clase de aplicación base.
component = DaggerCompClassComponent.builder()
.classModule(new ModuleClass()).build();
no puede encontrar DaggerCompClassComponent.
Tengo en el modulo build.gradle
apply plugin: ''com.neenbedankt.android-apt''
.........................
apt ''com.google.dagger:dagger-compiler:2.8''
compile ''com.google.dagger:dagger:2.8''
provided ''javax.annotation:jsr250-api:1.0''
y en el proyecto build.gradle,
classpath ''com.neenbedankt.gradle.plugins:android-apt:1.8''
He hecho construir / reconstruir / limpiar / reiniciar proyecto. Tengo una clase de componentes donde inyecto objetos y una clase de módulo donde proporciono objetos para inyectar.
¿Cuál puede ser la causa para no generar Dagger Component. clase ?
EDITAR:
Esta es mi clase de módulo, mencionada con @Module:
@Provides
@Singleton
public Interceptor provideInterceptor() {
return new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request.Builder builder = chain.request().newBuilder();
builder.addHeader("AppName-Android", BuildConfig.VERSION_NAME + "-" + BuildConfig.VERSION_CODE)
.addHeader("Content-Type", "application/json");
return chain.proceed(builder.build());
}
};
}
@Provides
@Singleton
OkHttpClient provideOkHttpClient(Interceptor interceptor) {
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.interceptors().add(interceptor);
return builder.build();
}
@Provides
@Singleton
Retrofit provideRetrofit(OkHttpClient client) {
return new Retrofit.Builder()
.baseUrl(BaseApplication.getRes().getString(R.string.api_base_url))
.addConverterFactory(GsonConverterFactory.create())
.client(client)
.build();
}
@Provides
@Singleton
WebServiceCall provideWebService(Retrofit retrofit) {
return retrofit.create(WebServiceCall.class);
}
Y esta es mi clase de componentes:
@Component(modules = ModuleClass.class)
@Singleton
public interface ComponentClass {
void inject(Interceptor o);
void inject(OkHttpClient o);
void inject(Retrofit o);
void inject(WebServiceCall o);
}
Al desarrollar en Kotlin, debe agregar las siguientes líneas junto a sus homólogos de annotationProcessor
procesador:
kapt ''com.google.dagger:dagger-android-processor:2.15''
kapt ''com.google.dagger:dagger-compiler:2.15''
y agregue el apply plugin: ''kotlin-kapt''
al inicio del mismo archivo.
Esa sección se ve así para mí:
apply plugin: ''com.android.application''
apply plugin: ''kotlin-android''
apply plugin: ''kotlin-kapt'' // <- Add this line
apply plugin: ''io.fabric''
Aquí está la solución para el nuevo proyecto Dagger.
Estas dos líneas son responsables de generar el marco de tiempo de compilación en Dagger 2.
compile ''com.google.dagger:dagger:2.14.1''
// genera el marco en el tiempo de compilaciónProcessor annotationProcessor ''com.google.dagger:dagger-compiler:2.14.1''
// genera el marco en el tiempo de compilación en función de las anotaciones que proporcionó .
Configuración completa daga
//dagger 2
compile ''com.google.dagger:dagger:2.14.1''
annotationProcessor ''com.google.dagger:dagger-compiler:2.14.1''
//to enable DaggerActivity, DaggerBroadcastReceiver, DaggerFragment etc classes
compile ''com.google.dagger:dagger-android:2.14.1''
annotationProcessor ''com.google.dagger:dagger-android-processor:2.14.1''
//support libraries with dagger 2
compile ''com.google.dagger:dagger-android-support:2.14.1''
Nota : debe configurar el proceso de anotación como se indica en la captura de pantalla a continuación. Puede hacer este File>Other Settings>Default Settings>
buscar "Annotation processor"
Hay algunos errores / fallas menores en su código de arriba, aquí hay una implementación que funciona:
Aplicación.java:
component = DaggerComponentClass.builder().classModule(new ModuleClass()).build();
La clase generada se llamará DaggerComponentClass
, no DaggerCompClassComponent
. Si no puede ejecutar su aplicación en Android Studio para compilarla, pruebe Build-> Clean project y Build-> Rebuild project en el menú. Si todo está bien, Dagger habrá compilado DaggerComponentClass
que se ubicará en el mismo paquete que ComponentClass
.
ComponentClass.java:
@Component(modules = ModuleClass.class)
public interface ComponentClass {
void inject(AClassThatShouldGetInstancesInjected instance);
}
Un componente en Dagger2 tiene métodos llamados inject
que reciben la instancia para obtener instancias inyectadas en él, y no al revés. En el código anterior, la clase AClassThatShouldGetInstancesInjected
normalmente llamará componentClass.inject(this);
para conseguir instancias inyectadas en si mismo.
ModuleClass.java:
@Module
public class ModuleClass {
@Provides
@Singleton
public Interceptor provideInterceptor() {/*code*/}
//Your Providers...
}
El módulo está correcto en su código, asegúrese de que esté anotado.
Si Dagger2 no puede generar sus componentes, significa que su código tiene algunos errores con Scopes / Modules. Revisa nuestros métodos @ @ Proporciona / Inyecta.
UPD:
Debe inyectar sus componentes en los casos en que necesite instancias de clases proporcionadas por el módulo.
me gusta
inject(MainActivity main);
Si tiene varios módulos en su AndroidStudio (módulos en términos de Android Studio, no Dagger), otra posible razón de falla es que se le olvidó colocar procesadores de anotación en el build.gradle
todos los módulos.
Hemos dividido nuestra aplicación en varios módulos, hemos actualizado las dependencias desde el uso de la implementation
hasta el uso de la api
pero se olvidó de manejar los procesadores de anotación en consecuencia.
Entonces, puedes tener estas líneas solo en un módulo raíz:
api ''com.google.dagger:dagger-android:2.16''
// if you use the support libraries
api ''com.google.dagger:dagger-android-support:2.16''
Pero estos deben especificarse en todas las dependencias de los módulos:
annotationProcessor ''com.google.dagger:dagger-compiler:2.16''
// if you use injections to Android classes
annotationProcessor ''com.google.dagger:dagger-android-processor:2.16''