未生成 Dagger 2 组件
Dagger 2 component not generated
在我的模块中,在我的基础应用程序中 class
component = DaggerCompClassComponent.builder()
.classModule(new ModuleClass()).build();
找不到 DaggerCompClass组件。
我有模块 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'
并在项目 build.gradle、
中
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
我已经完成构建/重建/清理/重启项目。我有一个 Component class 用于注入对象,还有一个 ModuleClass 用于提供要注入的对象。
没有生成 Dagger 组件的原因是什么。 class ?
编辑:
这是我的模块Class,用@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);
}
这是我的组件 Class:
@Component(modules = ModuleClass.class)
@Singleton
public interface ComponentClass {
void inject(Interceptor o);
void inject(OkHttpClient o);
void inject(Retrofit o);
void inject(WebServiceCall o);
}
如果 Dagger2 无法生成其组件,则意味着您的代码有一些错误 Scopes/Modules。检查我们的@Provides/Inject 方法。
更新:
您应该将组件注入到需要模块提供的 类 实例的情况下。
喜欢
inject(MainActivity main);
也许你忘了用 @Module 注解 ModuleClass ?
上面的代码中有一些小问题 misconceptions/faults,这是一个有效的实现:
Application.java:
component = DaggerComponentClass.builder().classModule(new ModuleClass()).build();
生成的 class 将被命名为 DaggerComponentClass
,而不是 DaggerCompClassComponent
。如果您无法在 Android Studio 中 运行 构建您的应用程序,请尝试菜单中的构建->清理项目和构建->重建项目。如果一切正常,Dagger 将编译 DaggerComponentClass
,它将位于与 ComponentClass
.
相同的包中
ComponentClass.java:
@Component(modules = ModuleClass.class)
public interface ComponentClass {
void inject(AClassThatShouldGetInstancesInjected instance);
}
Dagger2 中的组件具有名为 inject
的方法,这些方法接收实例以将实例注入其中,而不是相反。在上面的代码中,class AClassThatShouldGetInstancesInjected
通常会调用 componentClass.inject(this);
来将实例注入到自身中。
ModuleClass.java:
@Module
public class ModuleClass {
@Provides
@Singleton
public Interceptor provideInterceptor() {/*code*/}
//Your Providers...
}
您的代码中的模块是正确的,请确保其已注释。
更新(2020 年 3 月 29 日)
在 app-level build.gradle
内 dependencies
块内,添加以下行:
//dagger2
api 'com.google.dagger:dagger:2.24'
api 'com.google.dagger:dagger-android:2.24'
api 'com.google.dagger:dagger-android-support:2.24'
annotationProcessor 'com.google.dagger:dagger-compiler:2.24'
kapt 'com.google.dagger:dagger-compiler:2.24'
annotationProcessor 'com.google.dagger:dagger-android-processor:2.24'
kapt 'com.google.dagger:dagger-android-processor:2.24'
compileOnly 'javax.annotation:jsr250-api:1.0'
implementation 'javax.inject:javax.inject:1'
在 app-level 的 android
块内 build.gradle
、
kapt {
generateStubs = true
}
在 app-level build.gradle
的 top,正好在 中执行此操作下单.
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'kotlin-android-extensions'
最后,您需要按照下面的屏幕截图配置注释过程。您可以这样做 File>Other Settings>Settings for New Projects>
搜索"Annotation processor"
之后,从菜单 Build > Rebuild
执行。你完成了!
测试:
@Component
public interface ApplicationComponent {
}
现在,您可以将在 compile-time 生成的 DaggerApplicationComponent
用于您的 ApplicationComponent 接口。
public class MyApplication extends Application {
ApplicationComponent applicationComponent = DaggerApplicationComponent.create();
}
在 Kotlin 上开发时,您应该在 annotationProcessor
对应行旁边添加以下行:
kapt 'com.google.dagger:dagger-android-processor:2.15'
kapt 'com.google.dagger:dagger-compiler:2.15'
并在同一文件的开头添加 apply plugin: 'kotlin-kapt'
。
我觉得那个部分是这样的:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt' // <- Add this line
apply plugin: 'io.fabric'
如果您的 AndroidStudio 中有多个模块(AndroidStudio 中的模块,而不是 Dagger),另一个可能的失败原因是您忘记将注释处理器放入所有模块的 build.gradle
.
我们已将我们的应用程序分成几个模块,将依赖项从使用 implementation
更新为使用 api
,但忘记相应地处理注释处理器。
因此,您只能在根模块中使用以下行:
api 'com.google.dagger:dagger-android:2.16'
// if you use the support libraries
api 'com.google.dagger:dagger-android-support:2.16'
但是这个应该在所有模块依赖中指定:
annotationProcessor 'com.google.dagger:dagger-compiler:2.16'
// if you use injections to Android classes
annotationProcessor 'com.google.dagger:dagger-android-processor:2.16'
//add all the dependencies otherwise component class will not be generated.
implementation 'com.google.dagger:dagger-android:2.21'
implementation 'com.google.dagger:dagger-android-support:2.21'
annotationProcessor 'com.google.dagger:dagger-android-processor:2.21'
implementation 'com.google.dagger:dagger:2.21'
annotationProcessor 'com.google.dagger:dagger-compiler:2.21'
在build.gradle的app中,需要为Dagger添加必要的依赖,生成对应的类,如下:
implementation 'com.google.dagger:dagger-android:2.21'
implementation 'com.google.dagger:dagger-android-support:2.21' // if you use the support libraries
annotationProcessor 'com.google.dagger:dagger-android-processor:2.21'
annotationProcessor 'com.google.dagger:dagger-compiler:2.21'
你应该改变你正在使用的匕首版本。
参考 this
中的完整匕首文档
如果您使用的是 Kotlin,请确保将 kapt
(Kotlin 注释处理器)Gradle 插件添加到您的构建脚本中,并改用 kapt
Gradle 依赖类型annotationProcessor
用于 Dagger 编译器。
apply plugin: 'kotlin-kapt
kapt deps.daggercompiler
implementation deps.dagger
在我的例子中,它不是仅在 Instrumentation Testing 中创建的,因为我丢失了
kaptAndroidTest "com.google.dagger:dagger-compiler:$rootProject.daggerVersion"
当然,我使用的是 Kotlin,$rootProject.daggerVersion
是我的基础构建文件中的 属性。您可以替换任何版本或 gradle 您想要但缺少的依赖项。
api 'com.google.dagger:dagger-android:2.28.3'
api 'com.google.dagger:dagger-android-support:2.28.3'
annotationProcessor 'com.google.dagger:dagger-android-processor:2.28.3'
在应用级依赖项中将上面的依赖项替换为下面的依赖项,如果您使用了上面的内容
api 'com.google.dagger:dagger:2.28.3'
annotationProcessor 'com.google.dagger:dagger-compiler:2.28.3'
我通过编辑我的匕首依赖项解决了这个问题:
implementation "com.google.dagger:dagger:${versions.dagger}"
kapt "com.google.dagger:dagger-compiler:${versions.dagger}"
已接受的答案对我不起作用:
此问题与 Android Studio(V4.1.2
及更高版本)有关,您可以通过执行以下步骤解决此问题:
Pref -> Editor -> File Types -> Ignore Files And Folders -> Remove "Dagger*.java;"
此外,如果您看到其他 Dagger 正则表达式,也请将其删除。
现在 android studio 将找到生成的组件 class。
对于 2022 年在 Android Studio 上执行此操作的任何人,如果您只想使用 一些 Dagger 功能,则只需将其添加到您的 Gradle依赖项:
implementation 'com.google.dagger:dagger:2.41'
kapt 'com.google.dagger:dagger-compiler:2.41'
那么在你的插件上:
id 'kotlin-kapt'
您无需添加任何其他内容。
现在是关键步骤:您需要进行清理(在 Gradle 中或仅 select 生成菜单下的清理项目),因为出于某种原因增量编译是挡路了。
然后重建你的项目。
如果您正确创建了 Dagger 组件,此时您应该会看到编译错误,或者如果您正确创建它们,auto-completion 与您的组件现在应该可以在代码编辑器中工作。
在我的模块中,在我的基础应用程序中 class
component = DaggerCompClassComponent.builder()
.classModule(new ModuleClass()).build();
找不到 DaggerCompClass组件。
我有模块 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'
并在项目 build.gradle、
中 classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
我已经完成构建/重建/清理/重启项目。我有一个 Component class 用于注入对象,还有一个 ModuleClass 用于提供要注入的对象。
没有生成 Dagger 组件的原因是什么。 class ?
编辑:
这是我的模块Class,用@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);
}
这是我的组件 Class:
@Component(modules = ModuleClass.class)
@Singleton
public interface ComponentClass {
void inject(Interceptor o);
void inject(OkHttpClient o);
void inject(Retrofit o);
void inject(WebServiceCall o);
}
如果 Dagger2 无法生成其组件,则意味着您的代码有一些错误 Scopes/Modules。检查我们的@Provides/Inject 方法。
更新:
您应该将组件注入到需要模块提供的 类 实例的情况下。
喜欢
inject(MainActivity main);
也许你忘了用 @Module 注解 ModuleClass ?
上面的代码中有一些小问题 misconceptions/faults,这是一个有效的实现:
Application.java:
component = DaggerComponentClass.builder().classModule(new ModuleClass()).build();
生成的 class 将被命名为 DaggerComponentClass
,而不是 DaggerCompClassComponent
。如果您无法在 Android Studio 中 运行 构建您的应用程序,请尝试菜单中的构建->清理项目和构建->重建项目。如果一切正常,Dagger 将编译 DaggerComponentClass
,它将位于与 ComponentClass
.
ComponentClass.java:
@Component(modules = ModuleClass.class)
public interface ComponentClass {
void inject(AClassThatShouldGetInstancesInjected instance);
}
Dagger2 中的组件具有名为 inject
的方法,这些方法接收实例以将实例注入其中,而不是相反。在上面的代码中,class AClassThatShouldGetInstancesInjected
通常会调用 componentClass.inject(this);
来将实例注入到自身中。
ModuleClass.java:
@Module
public class ModuleClass {
@Provides
@Singleton
public Interceptor provideInterceptor() {/*code*/}
//Your Providers...
}
您的代码中的模块是正确的,请确保其已注释。
更新(2020 年 3 月 29 日)
在 app-level build.gradle
内 dependencies
块内,添加以下行:
//dagger2
api 'com.google.dagger:dagger:2.24'
api 'com.google.dagger:dagger-android:2.24'
api 'com.google.dagger:dagger-android-support:2.24'
annotationProcessor 'com.google.dagger:dagger-compiler:2.24'
kapt 'com.google.dagger:dagger-compiler:2.24'
annotationProcessor 'com.google.dagger:dagger-android-processor:2.24'
kapt 'com.google.dagger:dagger-android-processor:2.24'
compileOnly 'javax.annotation:jsr250-api:1.0'
implementation 'javax.inject:javax.inject:1'
在 app-level 的 android
块内 build.gradle
、
kapt {
generateStubs = true
}
在 app-level build.gradle
的 top,正好在 中执行此操作下单.
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'kotlin-android-extensions'
最后,您需要按照下面的屏幕截图配置注释过程。您可以这样做 File>Other Settings>Settings for New Projects>
搜索"Annotation processor"
之后,从菜单 Build > Rebuild
执行。你完成了!
测试:
@Component
public interface ApplicationComponent {
}
现在,您可以将在 compile-time 生成的 DaggerApplicationComponent
用于您的 ApplicationComponent 接口。
public class MyApplication extends Application {
ApplicationComponent applicationComponent = DaggerApplicationComponent.create();
}
在 Kotlin 上开发时,您应该在 annotationProcessor
对应行旁边添加以下行:
kapt 'com.google.dagger:dagger-android-processor:2.15'
kapt 'com.google.dagger:dagger-compiler:2.15'
并在同一文件的开头添加 apply plugin: 'kotlin-kapt'
。
我觉得那个部分是这样的:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt' // <- Add this line
apply plugin: 'io.fabric'
如果您的 AndroidStudio 中有多个模块(AndroidStudio 中的模块,而不是 Dagger),另一个可能的失败原因是您忘记将注释处理器放入所有模块的 build.gradle
.
我们已将我们的应用程序分成几个模块,将依赖项从使用 implementation
更新为使用 api
,但忘记相应地处理注释处理器。
因此,您只能在根模块中使用以下行:
api 'com.google.dagger:dagger-android:2.16'
// if you use the support libraries
api 'com.google.dagger:dagger-android-support:2.16'
但是这个应该在所有模块依赖中指定:
annotationProcessor 'com.google.dagger:dagger-compiler:2.16'
// if you use injections to Android classes
annotationProcessor 'com.google.dagger:dagger-android-processor:2.16'
//add all the dependencies otherwise component class will not be generated.
implementation 'com.google.dagger:dagger-android:2.21'
implementation 'com.google.dagger:dagger-android-support:2.21'
annotationProcessor 'com.google.dagger:dagger-android-processor:2.21'
implementation 'com.google.dagger:dagger:2.21'
annotationProcessor 'com.google.dagger:dagger-compiler:2.21'
在build.gradle的app中,需要为Dagger添加必要的依赖,生成对应的类,如下:
implementation 'com.google.dagger:dagger-android:2.21'
implementation 'com.google.dagger:dagger-android-support:2.21' // if you use the support libraries
annotationProcessor 'com.google.dagger:dagger-android-processor:2.21'
annotationProcessor 'com.google.dagger:dagger-compiler:2.21'
你应该改变你正在使用的匕首版本。
参考 this
中的完整匕首文档如果您使用的是 Kotlin,请确保将 kapt
(Kotlin 注释处理器)Gradle 插件添加到您的构建脚本中,并改用 kapt
Gradle 依赖类型annotationProcessor
用于 Dagger 编译器。
apply plugin: 'kotlin-kapt
kapt deps.daggercompiler
implementation deps.dagger
在我的例子中,它不是仅在 Instrumentation Testing 中创建的,因为我丢失了
kaptAndroidTest "com.google.dagger:dagger-compiler:$rootProject.daggerVersion"
当然,我使用的是 Kotlin,$rootProject.daggerVersion
是我的基础构建文件中的 属性。您可以替换任何版本或 gradle 您想要但缺少的依赖项。
api 'com.google.dagger:dagger-android:2.28.3'
api 'com.google.dagger:dagger-android-support:2.28.3'
annotationProcessor 'com.google.dagger:dagger-android-processor:2.28.3'
在应用级依赖项中将上面的依赖项替换为下面的依赖项,如果您使用了上面的内容
api 'com.google.dagger:dagger:2.28.3'
annotationProcessor 'com.google.dagger:dagger-compiler:2.28.3'
我通过编辑我的匕首依赖项解决了这个问题:
implementation "com.google.dagger:dagger:${versions.dagger}"
kapt "com.google.dagger:dagger-compiler:${versions.dagger}"
已接受的答案对我不起作用:
此问题与 Android Studio(V4.1.2
及更高版本)有关,您可以通过执行以下步骤解决此问题:
Pref -> Editor -> File Types -> Ignore Files And Folders -> Remove "Dagger*.java;"
此外,如果您看到其他 Dagger 正则表达式,也请将其删除。
现在 android studio 将找到生成的组件 class。
对于 2022 年在 Android Studio 上执行此操作的任何人,如果您只想使用 一些 Dagger 功能,则只需将其添加到您的 Gradle依赖项:
implementation 'com.google.dagger:dagger:2.41'
kapt 'com.google.dagger:dagger-compiler:2.41'
那么在你的插件上:
id 'kotlin-kapt'
您无需添加任何其他内容。
现在是关键步骤:您需要进行清理(在 Gradle 中或仅 select 生成菜单下的清理项目),因为出于某种原因增量编译是挡路了。
然后重建你的项目。
如果您正确创建了 Dagger 组件,此时您应该会看到编译错误,或者如果您正确创建它们,auto-completion 与您的组件现在应该可以在代码编辑器中工作。