在我的模块中,在我的基础应用程序类
中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'
我完成了build / rebuild / clean / restart项目。我有一个Component类,我在其中注入对象和一个ModuleClass,我提供了要注入的对象。
不生成Dagger组件的原因可能是什么。上课?
编辑:
这是我的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);
}
答案 0 :(得分:56)
在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'
答案 1 :(得分:23)
这是新Dagger项目的解决方案。
这两行负责在Dagger 2中生成编译时框架。
compile 'com.google.dagger:dagger:2.14.1'
//在编译时生成框架
annotationProcessor 'com.google.dagger:dagger-compiler:2.14.1'
//根据您提供的注释在编译时生成框架。
完全设置Dagger
//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'
注意:您需要按照以下屏幕截图中的说明配置注释流程。您可以执行此操作File>Other Settings>Default Settings>
搜索"Annotation processor"
答案 2 :(得分:6)
也许您忘了使用@Module注释ModuleClass?
答案 3 :(得分:3)
上面的代码中存在一些小的误解/错误,这是一个有效的实现:
<强> Application.java:强>
component = DaggerComponentClass.builder().classModule(new ModuleClass()).build();
生成的类名为DaggerComponentClass
,而不是DaggerCompClassComponent
。如果您无法在Android Studio中运行应用程序来构建它,请尝试在菜单中使用Build-&gt; Clean project和Build-&gt; Rebuild项目。如果一切正常,Dagger将编译DaggerComponentClass
,它将与ComponentClass
位于同一个包中。
<强> ComponentClass.java:强>
@Component(modules = ModuleClass.class)
public interface ComponentClass {
void inject(AClassThatShouldGetInstancesInjected instance);
}
Dagger2中的一个组件有一个名为inject
的方法,它接收实例以将实例注入其中,而不是相反。在上面的代码中,类AClassThatShouldGetInstancesInjected
通常会调用componentClass.inject(this);
来为实例注入实例。
<强> ModuleClass.java:强>
@Module
public class ModuleClass {
@Provides
@Singleton
public Interceptor provideInterceptor() {/*code*/}
//Your Providers...
}
模块在您的代码中是正确的,请确保其注释。
答案 4 :(得分:2)
如果您的AndroidStudio中有多个模块(就Android Studio而言,不是Dagger,则为模块),另一个失败的可能原因是您忘记将注释处理器放入所有模块的build.gradle
中。 / p>
我们将应用程序划分为多个模块,将依赖关系从使用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'
答案 5 :(得分:2)
在build.gradle的应用中,您需要为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
中的完整匕首文档答案 6 :(得分:2)
如果您使用的是Kotlin,请确保将kapt
(Kotlin注释处理器)Gradle插件添加到您的构建脚本中,并使用kapt
的Gradle依赖类型而不是annotationProcessor
作为Dagger Compiler。
apply plugin: 'kotlin-kapt
kapt deps.daggercompiler
implementation deps.dagger
答案 7 :(得分:0)
如果Dagger2无法生成其组件,则意味着您的代码在Scopes / Modules中存在一些错误。检查我们的@ Provide / Inject方法。
<强> UPD:强>
您应该将组件注入需要模块提供的类实例的情况。
喜欢
inject(MainActivity main);
答案 8 :(得分:0)
//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'
答案 9 :(得分:0)
就我而言,它并不是仅在Instrumentation Testing中创建的,因为我丢失了
kaptAndroidTest "com.google.dagger:dagger-compiler:$rootProject.daggerVersion"
我当然使用的是Kotlin,$rootProject.daggerVersion
是我的基本构建文件中的一个属性。您可以替换所需的任何版本或gradle依赖项,并丢失它们。
答案 10 :(得分:0)
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'
答案 11 :(得分:0)
我通过编辑对此的匕首依赖性来解决它:
implementation "com.google.dagger:dagger:${versions.dagger}"
kapt "com.google.dagger:dagger-compiler:${versions.dagger}"