提问人:ghita 提问时间:5/3/2017 最后编辑:ghita 更新时间:9/9/2023 访问量:63834
未生成 Dagger 2 组件
Dagger 2 component not generated
问:
在我的模块中,在我的基本 Application 类中
component = DaggerCompClassComponent.builder()
.classModule(new ModuleClass()).build();
它找不到 DaggerCompClassComponent。
我在模块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'
在 Project build.gradle 中,
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
我已经完成了构建/重建/清理/重启项目。我有一个 Component 类,用于注入对象,还有一个 ModuleClass,用于提供要注入的对象。
不生成匕首组件的原因是什么。类?
编辑:
这是我的 ModuleClass,用 @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);
}
这是我的组件类:
@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 无法生成其组件,则意味着您的代码在作用域/模块方面存在一些错误。检查我们的 @Provides/注入方法。
更新:
您应该将组件注入到需要模块提供的类实例的情况下。
喜欢
inject(MainActivity main);
评论
@Provides
也许你忘了用@Module注释 ModuleClass ?
上面的代码中有一些小的误解/错误,下面是一个有效的实现:
应用.java:
component = DaggerComponentClass.builder().classModule(new ModuleClass()).build();
生成的类将被命名为 ,而不是 。如果您无法在 Android Studio 中运行应用来构建应用,请尝试菜单中的 Build->Clean 项目和 Build->Rebuild 项目。如果一切正常,Dagger 将编译,它将位于与 相同的包中。DaggerComponentClass
DaggerCompClassComponent
DaggerComponentClass
ComponentClass
组件类:.java:
@Component(modules = ModuleClass.class)
public interface ComponentClass {
void inject(AClassThatShouldGetInstancesInjected instance);
}
Dagger2 中的组件具有命名的方法,这些方法接收实例以将实例注入其中,而不是相反。在上面的代码中,该类通常会调用将实例注入到自身中。inject
AClassThatShouldGetInstancesInjected
componentClass.inject(this);
模块类:.java:
@Module
public class ModuleClass {
@Provides
@Singleton
public Interceptor provideInterceptor() {/*code*/}
//Your Providers...
}
该模块在您的代码中是正确的,请确保它有注释。
评论
I removed @Singleton from ComponentClass since it's an annotation that is only relevant for modules.
嗯,不是吗?
@Singleton
@Inject
@Singleton
更新(2020 年 3 月 29 日)
在应用级 inside 块中,添加以下行: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'
应用级的内部块,android
build.gradle
kapt {
generateStubs = true
}
在应用级别的顶部,按完全下面的顺序执行此操作。build.gradle
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 {
}
现在,您可以将编译时生成的 ApplicationComponent 接口用于该接口。DaggerApplicationComponent
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 中有多个模块(Android Studio 中的模块,而不是 Dagger),另一个可能的失败原因是你忘记将注解处理器放入所有模块中。build.gradle
我们将应用程序划分为几个模块,将依赖项从 using 更新为 use,但忘记相应地处理注释处理器。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'
您应该更改您正在使用的匕首版本。
请参阅此处的完整匕首文档
如果您使用的是 Kotlin,请确保将(Kotlin 注释处理器)Gradle 插件添加到您的构建脚本中,并使用 Gradle 依赖项类型而不是 Dagger Compiler。kapt
kapt
annotationProcessor
apply plugin: 'kotlin-kapt
kapt deps.daggercompiler
implementation deps.dagger
就我而言,它不仅仅是在仪器测试中创建的,因为我错过了
kaptAndroidTest "com.google.dagger:dagger-compiler:$rootProject.daggerVersion"
当然,我使用的是 Kotlin,并且是我基本构建文件上的一个属性。您可以替换您想要但缺少的任何版本或 gradle 依赖项。$rootProject.daggerVersion
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'
如果已使用上述依赖项,请在应用级依赖项中将 above 替换为下面的依赖项
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 将找到生成的组件类。
评论
"Dagger*.java;"
对于 2022 年在 Android Studio 上执行此操作的任何人,如果您只想使用一些 Dagger 功能,您只需要在 Gradle 依赖项中添加以下内容:
implementation 'com.google.dagger:dagger:2.41'
kapt 'com.google.dagger:dagger-compiler:2.41'
然后这个在你的插件上:
id 'kotlin-kapt'
您无需添加任何其他内容。
现在这是关键的一步:您需要进行清理(在 Gradle 中或只需在 Build 菜单下选择 Clean Project),因为出于某种原因,增量编译会妨碍您。
然后重新生成项目。
如果您正确创建了 Dagger 组件,此时应该会看到编译错误,或者如果您正确创建了它们,则组件的自动完成现在应该可以在代码编辑器中工作。
评论
试试这个对 Kotlin 有用。就这么多build.gradle (Module YourProject.app)
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
id 'kotlin-kapt'
}
dependencies {
.....
implementation 'com.google.dagger:dagger-android:2.35.1'
kapt 'com.google.dagger:dagger-compiler:2.15'
implementation 'javax.inject:javax.inject:1'
.....
}
如果一个项目中有多个模块,则可以选择使用以下命令为一个模块生成 Dagger2 类。
./gradlew <module-name>:kaptDebugKotlin
我花了一个小时,因为我错误地使用了错误的导入。
import com.google.android.datatransport.runtime.dagger.Module
import com.google.android.datatransport.runtime.dagger.Provides
import com.google.android.datatransport.runtime.dagger.Component
正确的导入:
import dagger.Component
import dagger.Module
import dagger.Provides
评论
void inject(...)