¿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 
  • Base de datos de habitaciones Singleton en SyncAdapter para activar LiveData
  • Escalar una vista de niño toma la misma altura
  • ¿Cómo suscribirse a los events hub después de que hubConnection se volvió a conectar en signalR en Android?
  • Moshi: se esperaba una Clase, Tipo Paramétrico o Tipo de Armario Genérico, pero <nulo> es de tipo nulo
  • Kotlinx inyecta vista desde el layout incorrecto
  • En Kotlin, ¿cómo integro una promise de Kovenant con las respuestas asincrónicas de Elasticsearch?
  • ¿Cómo orderar la list de objects en caso de order insensible?
  • Escriba inferencia con constructores funcionales
  • ¿Convertir mi proyecto de estudio andorid existente a kotlin?
  • "Objeto" no es parte del esquema para este Reino
  • Kotlin me hace chocar! ¿Es una function o una class cuando leo un código?