当 Dagger 不自动生成组件代码时对 gradle 文件进行故障排除
Troubleshooting gradle file when dagger doesn't auto-generate component code
更新:Link 到项目 -> https://drive.google.com/open?id=1D8mYZL3Pb8FezPp5FOKA20-Um5kTRYxH
我一直在使用 Dagger 并遵循本教程直到步骤 5.4:https://www.vogella.com/tutorials/Dagger/article.html#special-treatment-of-fields-in-dagger
我添加了以下依赖:
api 'com.google.dagger:dagger:2.20'
api 'com.google.dagger:dagger-android:2.20'
annotationProcessor 'com.google.dagger:dagger-android-processor:2.20'
annotationProcessor 'com.google.dagger:dagger-compiler:2.20'
compileOnly 'javax.annotation:jsr250-api:1.0'
但是IDE无法解析"DaggerMyApplicationComponent"(在onCreate()中)。好像 Dagger 无法生成代码。
MyApplication.java
import android.app.Activity;
import android.app.Application;
import javax.inject.Inject;
import dagger.android.DispatchingAndroidInjector;
import dagger.android.HasActivityInjector;
public class MyApplication extends Application implements HasActivityInjector {
@Inject
DispatchingAndroidInjector<Activity> dispatchingAndroidInjector;
@Override
public void onCreate() {
super.onCreate();
DaggerMyApplicationComponent.create().inject(this);
}
@Override
public DispatchingAndroidInjector<Activity> activityInjector() {
return dispatchingAndroidInjector;
}
}
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.parassidhu.daggerkumar">
<application
android:name=".MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
MyApplicationModule.java:
import dagger.Module;
import dagger.android.ContributesAndroidInjector;
@Module
public abstract class MyApplicationModule {
@ContributesAndroidInjector
abstract MainActivity contributeActivityInjector();
}
MyApplicationComponent.java:
import javax.inject.Singleton;
import dagger.Component;
import dagger.android.AndroidInjectionModule;
import dagger.android.AndroidInjector;
@Singleton
@Component(modules = {AndroidInjectionModule.class, MyApplicationModule.class})
public interface MyApplicationComponent extends AndroidInjector<MyApplication> {
}
请指出可能存在的问题。我已经尝试了 Make Project、Clean、Rebuild、Invalidate 和 Restart 几次,但都没有帮助。
我已经解决了这个问题。解决方案非常奇怪。我将依赖项更改为:
api 'com.google.dagger:dagger:2.20'
api 'com.google.dagger:dagger-android:2.20'
kapt 'com.google.dagger:dagger-android-processor:2.20'
kapt 'com.google.dagger:dagger-compiler:2.20'
总的来说,我使用了 kapt
而不是 annotationProcessor
,然后 Clean Project 和 Make Project 然后 boom !成功了。
奇怪的部分来了。尽管在项目中配置了 Kotlin,但我的项目中没有一个 Kotlin 文件(默认的插桩测试除外)。如果有人能对此有所了解,我们将不胜感激。
希望对您有所帮助!
如评论中所述,从 gradle 中删除所有不必要的 kotlin 依赖项和插件。如果您的项目中没有 kotlin 代码,那么将您的模块称为 kotlin 模块是没有意义的。 Dagger 认为它应该生成 kotlin 代码,但它没有 kotlin 编译器来执行此操作。因此,要么将整个代码更改为 kotlin 并使用 kotlin 依赖项,要么坚持 java 并删除所有 kotlin 依赖项。
更新:Link 到项目 -> https://drive.google.com/open?id=1D8mYZL3Pb8FezPp5FOKA20-Um5kTRYxH
我一直在使用 Dagger 并遵循本教程直到步骤 5.4:https://www.vogella.com/tutorials/Dagger/article.html#special-treatment-of-fields-in-dagger
我添加了以下依赖:
api 'com.google.dagger:dagger:2.20'
api 'com.google.dagger:dagger-android:2.20'
annotationProcessor 'com.google.dagger:dagger-android-processor:2.20'
annotationProcessor 'com.google.dagger:dagger-compiler:2.20'
compileOnly 'javax.annotation:jsr250-api:1.0'
但是IDE无法解析"DaggerMyApplicationComponent"(在onCreate()中)。好像 Dagger 无法生成代码。
MyApplication.java
import android.app.Activity;
import android.app.Application;
import javax.inject.Inject;
import dagger.android.DispatchingAndroidInjector;
import dagger.android.HasActivityInjector;
public class MyApplication extends Application implements HasActivityInjector {
@Inject
DispatchingAndroidInjector<Activity> dispatchingAndroidInjector;
@Override
public void onCreate() {
super.onCreate();
DaggerMyApplicationComponent.create().inject(this);
}
@Override
public DispatchingAndroidInjector<Activity> activityInjector() {
return dispatchingAndroidInjector;
}
}
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.parassidhu.daggerkumar">
<application
android:name=".MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
MyApplicationModule.java:
import dagger.Module;
import dagger.android.ContributesAndroidInjector;
@Module
public abstract class MyApplicationModule {
@ContributesAndroidInjector
abstract MainActivity contributeActivityInjector();
}
MyApplicationComponent.java:
import javax.inject.Singleton;
import dagger.Component;
import dagger.android.AndroidInjectionModule;
import dagger.android.AndroidInjector;
@Singleton
@Component(modules = {AndroidInjectionModule.class, MyApplicationModule.class})
public interface MyApplicationComponent extends AndroidInjector<MyApplication> {
}
请指出可能存在的问题。我已经尝试了 Make Project、Clean、Rebuild、Invalidate 和 Restart 几次,但都没有帮助。
我已经解决了这个问题。解决方案非常奇怪。我将依赖项更改为:
api 'com.google.dagger:dagger:2.20'
api 'com.google.dagger:dagger-android:2.20'
kapt 'com.google.dagger:dagger-android-processor:2.20'
kapt 'com.google.dagger:dagger-compiler:2.20'
总的来说,我使用了 kapt
而不是 annotationProcessor
,然后 Clean Project 和 Make Project 然后 boom !成功了。
奇怪的部分来了。尽管在项目中配置了 Kotlin,但我的项目中没有一个 Kotlin 文件(默认的插桩测试除外)。如果有人能对此有所了解,我们将不胜感激。
希望对您有所帮助!
如评论中所述,从 gradle 中删除所有不必要的 kotlin 依赖项和插件。如果您的项目中没有 kotlin 代码,那么将您的模块称为 kotlin 模块是没有意义的。 Dagger 认为它应该生成 kotlin 代码,但它没有 kotlin 编译器来执行此操作。因此,要么将整个代码更改为 kotlin 并使用 kotlin 依赖项,要么坚持 java 并删除所有 kotlin 依赖项。