android - 无法使用 Dagger 2 运行 Kotlin

标签 android kotlin dagger-2

我是 kotlin 和 dagger 2 的新手。我尝试关注这个 guide在安卓Java中。但是错误被抛出...

Error:Execution failed for task ':app:kaptDebugKotlin'. Internal compiler error. See log for more details

我做错了什么?

申请

class App : Application() {

    val netComponent: NetComponent by lazy {
        DaggerNetComponent.builder()
                .appModule(AppModule(this)) // This also corresponds to the name of your module: %component_name%Module
                .netModule(NetModule("https://api.github.com"))
                .build()
    }

    override fun onCreate() {
        super.onCreate()
    }

    fun netComponent() : NetComponent = netComponent
}

网络组件

@Singleton
@Component(modules= arrayOf(AppModule::class, NetModule::class))
interface NetComponent {
    fun inject(activity: HomeActivity)
}

网络模块

@Module()
class NetModule(baseUrl: String) {

    val mBaseUrl: String = baseUrl;

    @Provides
    @Singleton
    fun providedSharedPreferences(app: Application): SharedPreferences {
        return PreferenceManager.getDefaultSharedPreferences(app);
    }

    @Provides
    @Singleton
    fun provideOkHttpCache(app: Application): Cache {
        val cacheSize = 10 * 1024 * 1024 // 10 MiB
        return Cache(app.cacheDir, cacheSize.toLong())
    }

    @Provides
    @Singleton
    fun providedGson(): Gson {
        return GsonBuilder()
                .excludeFieldsWithoutExposeAnnotation()
                .create();
    }

    @Provides
    @Singleton
    fun provideOkHttpClient(cache: Cache): OkHttpClient {
        return OkHttpClient.Builder()
                .cache(cache)
                .build();
    }

    @Provides
    @Singleton
    fun provideRetrofit(gson: Gson, okHttpClient: OkHttpClient): Retrofit {
        return Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create(gson))
                .baseUrl(mBaseUrl)
                .client(okHttpClient)
                .build()
    }

}

应用模块

@Module()
class AppModule(val app: App) {

    @Provides
    @Singleton
    fun provideApp() = app

}

应用组件

@Singleton
@Component(modules = arrayOf(AppModule::class))
interface AppComponent {

    fun inject(app: App)
}

最后,HomeActivity

class HomeActivity : AppCompatActivity() {

    @Inject var sharedPreferences: SharedPreferences? = null;

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_home)
        (application as App).netComponent.inject(this)
    }
}

It's build failed when I start using @Inject annotation to HomeActivity Class.

Gradle 应用

apply plugin: 'com.android.application'

apply plugin: 'kotlin-kapt'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion rootProject.ext.compileSdkVersion
    buildToolsVersion rootProject.ext.buildToolsVersion
    defaultConfig {
        applicationId "com.viinsoft.mobile.app"
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    // App's dependencies, including test
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    kapt "com.google.dagger:dagger-compiler:$dragger"
    implementation "com.google.dagger:dagger:$dragger"
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
    implementation "com.android.support:design:$supportLibraryVersion"
    implementation "com.android.support.constraint:constraint-layout:$constraintLayout"
    implementation "com.github.bumptech.glide:glide:$glideVersion"
    implementation "com.squareup.retrofit2:retrofit:$retrofit"
    implementation "com.squareup.retrofit2:converter-gson:$retrofit"
    implementation "com.google.code.gson:gson:$gson"
    implementation "com.google.guava:guava:$guavaVersion"
    implementation "com.android.support.test.espresso:espresso-idling-resource:$espressoVersion"

    // Dependencies for local unit tests
    testCompile "junit:junit:$junitVersion"
    testCompile "org.mockito:mockito-all:$mockitoVersion"
    testCompile "org.hamcrest:hamcrest-all:$hamcrestVersion"
    testCompile "org.powermock:powermock-module-junit4:$powerMockito"
    testCompile "org.powermock:powermock-api-mockito:$powerMockito"

    // Android Testing Support Library's runner and rules
    androidTestCompile "com.android.support.test:runner:$runnerVersion"
    androidTestCompile "com.android.support.test:rules:$rulesVersion"

    // Espresso UI Testing dependencies.
    androidTestCompile ("com.android.support.test.espresso:espresso-core:$espressoVersion", {
        exclude group: 'com.google.code.findbugs'
    })
    androidTestCompile ("com.android.support.test.espresso:espresso-contrib:$espressoVersion", {
        exclude group: 'com.google.code.findbugs'
    })
    androidTestCompile ("com.android.support.test.espresso:espresso-intents:$espressoVersion", {
        exclude group: 'com.google.code.findbugs'
    })
}

kapt {
    generateStubs = true
}

渐变项目

buildscript {
    ext.kotlin_version = '1.1.4-3'
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0-beta4'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

ext {
    // Sdk and tools
    minSdkVersion = 16
    targetSdkVersion = 26
    compileSdkVersion = 26
    buildToolsVersion = '26.0.1'

    // App dependencies
    supportLibraryVersion = '26.0.2'
    constraintLayout = '1.0.2'
    retrofit = '2.3.0'
    gson = '2.8.1'
    glideVersion = '4.0.0'
    guavaVersion = '23.0-android'
    dragger = '2.11'

    // Dependencies for local unit tests
    junitVersion = '4.12'
    mockitoVersion = '1.10.19'
    powerMockito = '1.7.1'
    hamcrestVersion = '1.3'

    // Android Testing Support Library's runner and rules
    runnerVersion = '1.0.0'
    rulesVersion = '1.0.0'

    // Espresso UI Testing dependencies.
    espressoVersion = '3.0.1'
}

编辑 GRADLE 日志

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:kaptDebugKotlin'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:100)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:70)
        at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:63)
        at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54)
        at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
        at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:88)
        at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:52)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
        at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.run(DefaultTaskGraphExecuter.java:248)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:197)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:107)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:241)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:230)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.processTask(DefaultTaskPlanExecutor.java:124)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.access$200(DefaultTaskPlanExecutor.java:80)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:105)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:99)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.execute(DefaultTaskExecutionPlan.java:625)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.executeWithTask(DefaultTaskExecutionPlan.java:580)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.run(DefaultTaskPlanExecutor.java:99)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
Caused by: org.gradle.api.GradleException: Internal compiler error. See log for more details
        at org.jetbrains.kotlin.gradle.tasks.TasksUtilsKt.throwGradleExceptionIfError(tasksUtils.kt:9)
        at org.jetbrains.kotlin.gradle.internal.KaptTask.compile(KaptTask.kt:71)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
        at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.doExecute(DefaultTaskClassInfoStore.java:141)
        at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:134)
        at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:121)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:731)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:705)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsTaskExecuter.java:122)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:197)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:107)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:111)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:92)
        ... 27 more

最佳答案

我在 Kotlin 上使用 Dagger2,尝试这样做:

@Inject lateinit var sharedPreferences: SharedPreferences

代替:

@Inject var sharedPreferences: SharedPreferences? = null

这样我也解决了 Butterknife 的问题。

编辑:打开 Gradle Console,它可能会给出错误: enter image description here

关于android - 无法使用 Dagger 2 运行 Kotlin ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46021718/

相关文章:

android - Flutter - 如何在应用邀请功能的 Firebase 动态链接中传递自定义参数?

android - 删除 Kotlin 中变量阴影的警告

Kotlin - 错误 : Could not find or load main class _DefaultPackage

java - Android 上的 Dagger 2 @Singleton 注释类未被注入(inject)

android - Dagger 为什么要创建自定义作用域

android - 安装 apk 时的 INSTALL_FAILED_NO_MATCHING_ABIS

Android:带有参数的 Intent

android - 将 Android 应用程序连接到托管在 AWS 上的 MySQL 数据库

android - 如何在 viewpager 中使用 webview 的水平滚动?

java - Dagger 2 模块与子组件