2016-12-24 4 views
6

Я пытаюсь добавить Kotlin в свой проект, но после включения Kotlin я не могу построить, поскольку классы Dagger2 больше не генерируются. Я попробовал второй проект, и у меня такая же проблема (на самом деле хуже, он жалуется как на Dagger2, так и на DataBinding).Kotlin and 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 

App 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

Я не знаю, о чем вы это говорите, но информация, которую я нашел онлайн для Dagger2 с Kotlin, ясно указывает, что необходимо использовать процессор 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 
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. Теперь вы можете создавать подкомпоненты для разных действий или фрагментов и вводить их.