在我的模块中,在我的基础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'
我已经完成了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);
}
在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'
这是新鲜Dagger项目的解决方案。
这两行负责在Dagger 2中生成编译时框架。
compile 'com.google.dagger:dagger:2.14.1'
//在编译时生成框架time
annotationProcessor 'com.google.dagger:dagger-compiler:2.14.1'
//根据您提供的注释在编译时生成框架。
完全设置匕首
//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>
search"Annotation processor"
也许你忘了用@Module注释ModuleClass?
上面的代码中存在一些小的误解/错误,这是一个有效的实现:
application.Java:
component = DaggerComponentClass.builder().classModule(new ModuleClass()).build();
生成的类将命名为DaggerComponentClass
,而不是DaggerCompClassComponent
。如果您无法在Android Studio中运行应用程序来构建它,请在菜单中尝试Build-> Clean project和Build-> Rebuild项目。如果一切正常,Dagger将编译DaggerComponentClass
,它将与ComponentClass
位于同一个包中。
component class.Java:
@Component(modules = ModuleClass.class)
public interface ComponentClass {
void inject(AClassThatShouldGetInstancesInjected instance);
}
Dagger2中的一个组件有一个名为inject
的方法,它接收实例以将实例注入其中,而不是相反。在上面的代码中,类AClassThatShouldGetInstancesInjected
通常会调用componentClass.inject(this);
来将实例注入其自身。
module class.Java:
@Module
public class ModuleClass {
@Provides
@Singleton
public Interceptor provideInterceptor() {/*code*/}
//Your Providers...
}
模块在您的代码中是正确的,请确保其注释。
如果您的AndroidStudio中有多个模块(Android Studio中的模块,而不是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'
在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中提到完整的匕首文件
如果您使用的是Kotlin,请确保将kapt
(Kotlin注释处理器)Gradle插件添加到您的构建脚本中,并使用kapt
Gradle依赖类型而不是annotationProcessor
用于Dagger编译器。
apply plugin: 'kotlin-kapt
kapt deps.daggercompiler
implementation deps.dagger
如果Dagger2无法生成其组件,则意味着您的代码与Scopes / Modules有一些错误。检查我们的@ Provide / Inject方法。
UPD:
您应该将组件注入需要模块提供的类实例的情况。
喜欢
inject(MainActivity main);
//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'