2016-12-24 75 views
6

我正在嘗試將Kotlin添加到我的項目中,但啓用Kotlin之後,我無法構建Dagger2類不再生成。我嘗試了第二個項目,而且我遇到了同樣的問題(實際上它更糟,它抱怨Dagger2和DataBinding)。Kotlin和Dagger2

這些都是我做,以使科特林的變化:

項目的build.gradle:

diff --git a/build.gradle b/build.gradle 
index 486700c..91e4cda 100644 
--- a/build.gradle 
+++ b/build.gradle 
@@ -1,13 +1,15 @@ 
// Top-level build file where you can add configuration options common to all sub-projects/modules. 

buildscript { 
+ ext.kotlin_version = '1.0.5-3' 
    repositories { 
     jcenter() 
    } 
    dependencies { 
-  classpath 'com.android.tools.build:gradle:2.3.0-alpha2' 
+  classpath 'com.android.tools.build:gradle:2.3.0-beta1' 
     classpath 'com.google.gms:google-services:3.0.0' 
     classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' 
+  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 

應用的build.gradle:

diff --git a/app/build.gradle b/app/build.gradle 
index 345dab0..e59f91c 100644 
--- a/app/build.gradle 
+++ b/app/build.gradle 
@@ -1,5 +1,6 @@ 
apply plugin: 'com.android.application' 
-apply plugin: 'com.neenbedankt.android-apt' 
+apply plugin: 'kotlin-android' 
+apply plugin: 'kotlin-kapt' 

android { 
    compileSdkVersion 25 
@@ -39,6 +40,13 @@ android { 
     incremental true 
     javaMaxHeapSize "5g" 
    } 
+ sourceSets { 
+  main.java.srcDirs += 'src/main/kotlin' 
+ } 
+} 
+ 
+kapt { 
+ generateStubs = true 
} 

dependencies { 
@@ -71,11 +79,15 @@ dependencies { 
    compile 'com.artemzin.rxjava:proguard-rules:1.2.1.0' 

    // Dagger 2 
- apt 'com.google.dagger:dagger-compiler:2.7' 
- testApt 'com.google.dagger:dagger-compiler:2.7' 
+ kapt 'com.google.dagger:dagger-compiler:2.7' 
+ //testApt 'com.google.dagger:dagger-compiler:2.7' 
    compile 'com.google.dagger:dagger:2.7' 
    provided 'javax.annotation:jsr250-api:1.0' 
+ compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" 
} 

apply plugin: 'com.google.gms.google-services' 
+repositories { 
+ mavenCentral() 
+} 

錯誤發生在這裏:

sObjectGraph = DaggerObjectGraph 
    .builder() 
    .appModule(new AppModule(context.getApplicationContext())) 
    .build(); 

其中DaggerObjectGraph不再被定義。

任何幫助將不勝感激。

+0

我認爲你不應該明確使用'kotlin-kapt'。這是一個瘋狂的猜測。 – EpicPandaForce

+0

我不知道你是什麼意思,但我在網上找到的有關Kotlin的Dagger2的信息清楚地表明需要使用kapt處理器(https://blog.jetbrains.com/kotlin/2015/06/better -annotation處理支承存根合kapt /)。 – Francesc

+0

試試吧。 – EpicPandaForce

回答

2

只是刪除

kapt { 
    generateStubs = true 
} 
0

問題是您正在使用

DaggerObjectGraph

這不再dagger2可用。

Here is the documentation for dagger 2

這是你的應用程序級的build.gradle一個工作版本

添加依賴封閉在以下

compile "com.google.dagger:dagger:2.9" 
    kapt "com.google.dagger:dagger-compiler:2.9" 
    provided 'javax.annotation:jsr250-api:1.0' 

也將其添加到同一個文件

kapt { 
    generateStubs = true 
} 

然後創建組件和模塊類並注入你想要的任何活動或片段。

下面是一個示例組件類

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

    fun gson() : Gson 
    fun retrofit(): Retrofit 
    fun okHttpClient(): OkHttpClient 
} 

在這裏是一個示例Module類

@Module 
class AppModule(internal var mApplication: Application) { 

    @Provides 
    @Singleton 
    fun providesApplication(): Application { 
     return mApplication 
    } 

} 

以我的應用程序類

class App : Application() { 

companion object { 
    @JvmStatic lateinit var component: AppComponent 
} 

override fun onCreate() { 
    super.onCreate() 

    appComponent = DaggerAppComponent.builder() 
      .appModule(AppModule(this)) 
      .netModule(NetModule(Constants.BASE_URL)) 
      .build() 

} 


} 

這是匕首組件是如何在匕首初始化2.現在可以爲不同的活動或片段創建子組件並注入它們。