在Dagger无法自动生成组件代码时对Gradle文件进行故障排除

时间:2019-09-10 02:22:45

标签: android android-gradle-plugin dagger-2

更新:链接到项目-> 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> {

}

请提出可能出问题的地方。我已经尝试过几次“制作项目”,“清理”,“重建”,“无效”和“重新启动”,但是没有帮助。

2 个答案:

答案 0 :(得分:1)

如评论中所述,从gradle中删除所有不必要的kotlin依赖项和插件。如果您的项目中没有kotlin代码,则将模块称为kotlin模块是没有意义的。 Dagger认为它应该生成kotlin代码,但它没有kotlin编译器来执行。因此,要么将整个代码更改为kotlin并使用kotlin依赖项,要么坚持使用Java并删除所有kotlin依赖项。

答案 1 :(得分:-1)

我已经解决了这个问题。解决方案很奇怪。我将依赖项更改为:

    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,然后清洁项目进行项目,繁荣起来!奏效了。

现在出现了奇怪的部分。尽管在项目中配置了Kotlin,但我的项目中没有一个Kotlin文件(默认的测试除外)。如果有人可以了解它,将不胜感激。

希望有帮助!