¿Cómo podemos usar Dagger2 con kotlin?

Quiero usar Dagger2 con kotlin. Pero luego uso esta configuration para dagger2 con kotlin por cierto en Internet, ocurre un problema.

//build.gradle apply plugin: 'kotlin-kapt' kapt { generateStubs = true } ... dependencies { compile 'com.google.dagger:dagger-android:2.11' compile 'com.google.dagger:dagger-android-support:2.11' kapt 'com.google.dagger:dagger-android-processor:2.11' kapt 'com.google.dagger:dagger-compiler:2.11' } 

Aquí hay un problema, estoy usando Lombok también. ¿Este es el problema?

 e: java.lang.IllegalStateException: failed to analyze: org.jetbrains.kotlin.kapt3.diagnostic.KaptError: Error while annotation processing at org.jetbrains.kotlin.analyzer.AnalysisResult.throwIfError(AnalysisResult.kt:57) at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules(KotlinToJVMBytecodeCompiler.kt:137) at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:158) at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:61) at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.java:107) at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.java:51) at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:92) at org.jetbrains.kotlin.daemon.CompileServiceImpl$compile$1$2.invoke(CompileServiceImpl.kt:386) at org.jetbrains.kotlin.daemon.CompileServiceImpl$compile$1$2.invoke(CompileServiceImpl.kt:96) at org.jetbrains.kotlin.daemon.CompileServiceImpl$doCompile$$inlined$ifAlive$lambda$2.invoke(CompileServiceImpl.kt:892) at org.jetbrains.kotlin.daemon.CompileServiceImpl$doCompile$$inlined$ifAlive$lambda$2.invoke(CompileServiceImpl.kt:96) at org.jetbrains.kotlin.daemon.common.DummyProfiler.withMeasure(PerfUtils.kt:137) at org.jetbrains.kotlin.daemon.CompileServiceImpl.checkedCompile(CompileServiceImpl.kt:919) at org.jetbrains.kotlin.daemon.CompileServiceImpl.doCompile(CompileServiceImpl.kt:891) at org.jetbrains.kotlin.daemon.CompileServiceImpl.compile(CompileServiceImpl.kt:385) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:346) at sun.rmi.transport.Transport$1.run(Transport.java:200) at sun.rmi.transport.Transport$1.run(Transport.java:197) at java.security.AccessController.doPrivileged(Native Method) at sun.rmi.transport.Transport.serviceCall(Transport.java:196) at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:683) at java.security.AccessController.doPrivileged(Native Method) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) Caused by: org.jetbrains.kotlin.kapt3.diagnostic.KaptError: Error while annotation processing at org.jetbrains.kotlin.kapt3.AnnotationProcessingKt.doAnnotationProcessing(annotationProcessing.kt:90) at org.jetbrains.kotlin.kapt3.AnnotationProcessingKt.doAnnotationProcessing$default(annotationProcessing.kt:42) at org.jetbrains.kotlin.kapt3.AbstractKapt3Extension.runAnnotationProcessing(Kapt3Extension.kt:205) at org.jetbrains.kotlin.kapt3.AbstractKapt3Extension.analysisCompleted(Kapt3Extension.kt:166) at org.jetbrains.kotlin.kapt3.ClasspathBasedKapt3Extension.analysisCompleted(Kapt3Extension.kt:82) at org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM$analyzeFilesWithJavaIntegration$2.invoke(TopDownAnalyzerFacadeForJVM.kt:96) at org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration(TopDownAnalyzerFacadeForJVM.kt:106) at org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration$default(TopDownAnalyzerFacadeForJVM.kt:83) at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler$analyze$1.invoke(KotlinToJVMBytecodeCompiler.kt:376) at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler$analyze$1.invoke(KotlinToJVMBytecodeCompiler.kt:67) at org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport.analyzeAndReport(AnalyzerWithCompilerReport.kt:96) at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.analyze(KotlinToJVMBytecodeCompiler.kt:367) at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules(KotlinToJVMBytecodeCompiler.kt:132) ... 30 more :app:kaptStagingDebugKotlin FAILED FAILURE: Build failed with an exception. 

MenuActivity

 abstract class MenuActivity : BaseFragmentActivity() { @Inject internal var presenter: MenuPresenter? = null override fun baseFragmentWithTag(): Map<String, Class<out BaseManagerFragment>> { val map = HashMap<String, Class<out BaseManagerFragment>>() for (tag in MenuScreensTag.values()) map.put(tag.getTag(), tag.getFragmentClazz()) return map } @JvmOverloads fun switchTag(screensTag: MenuScreensTag, clearCurrentStack: Boolean = false) { val tag = screensTag.getTag() switchToStackByTag(tag, clearCurrentStack) } public override fun inject(appComponent: AppComponent) { val component = DaggerMenuComponent.builder() .appComponent(appComponent) .menuModule(MenuModule(this)) .build() component.injectFragment(this) component.injectPresenter(presenter!!) } } 

Aquí está el código de MenuActivity . Solo uso el plugin de kotlin para convertir java a kotlin directamente. Entonces el error ocurre.

Como supones ya, Lombok es el problema. Kapt se ejecuta antes de Lombok y, por lo tanto, algunas classs relevantes o al less partes de ella aún no existen. Por lo tanto, la compilation falla.

En nuestro caso, reemplazamos Lombok con las classs de datos Kotlin de una vez. Alternativamente, puede mover todas estas classs a un module separado que comstack antes de ejecutar Kapt la primera vez. Si no tiene muchas classs, también puede actualizarlas o implementarlas manualmente.

Gracias a todos, he resuelto esto.

hacer

 @Inject internal var presenter: MenuPresenter? = null 

a

 @Inject lateinit var presenter: MenuPresenter? = null 
  • Firebase Firestre Android no puede deserializar el object
  • ¿Cuál es la forma correcta de usar una comparación "mayor que" o "menor que" en integers nulables en Kotlin?
  • Reactor Flux <MyObject> a Mono <List <MyObject >>
  • Cómo hacer un event handling errores en rxjava2 en android
  • Cómo crear una secuencia infinitamente larga en Kotlin
  • Cómo notificar a Observable cuando finalice CountdownTimer
  • Kotlin, estructura del proyecto
  • Errores de estudio de Android Kotlin de data binding
  • Firebase no obtiene datos del método onDataChange
  • Primavera @Autocableado en Kotlin
  • Convierta ejecutable indefinidamente Runnable de Java a Kotlin