2017-12-13 2 views
0

Ich möchte Dagger2 mit Kotlin verwenden. Aber dann benutze ich diese Einstellung für dagger2 mit Kotlin übrigens im Internet, es tritt ein Problem auf.Wie können wir Dagger2 mit Kotlin verwenden?

//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' 
} 

Hier ein Problem, ich benutze auch Lombok. Ist das das Problem?

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!!) 
    } 
} 

Hier ist der MenuActivity Code. Ich benutze einfach Kotlin-Plugin, um Java direkt in Kotlin zu konvertieren. Dann tritt der Fehler auf.

+0

Blättern Sie auf dem Fehler, sollten es mehr spezifische Fehlerprotokolle, wenn es Dolch –

+0

Ja, es gibt zu viele Fehler Info Weiterführend ist. Es scheint, dass sie mit Lombok und Datenbindung verbunden sind –

Antwort

0

Wie Sie bereits angenommen, Lombok ist das Problem. Kapt läuft vor Lombok und damit einige relevante Klassen oder zumindest Teile davon existieren noch nicht. Daher schlägt die Kompilierung fehl.

In unserem Fall ersetzt wir Lombok mit Kotlin Datenklassen in einem Rutsch. Alternativ können Sie alle diese Klassen in ein separates Modul verschieben, das vor dem ersten Ausführen Kapt erstellt. Wenn Sie nicht zu viele Klassen haben, können Sie diese auch de-lombok oder implementieren, was Sie manuell benötigen.

+1

danke, vielleicht sollte ich den Lombok aufgeben. –

+0

und ich finde einen Fehler: '' ' /Users/jafir/Documents/Base/app/build/tmp/kapt3/stubs/stagingDebug/com/jafir/base/ui/activity/base/MenuActivity.java: 7: 错误: Dolch unterstützt keine Injektion in private Felder e: e: private com.jafir.base.ui.presenter.MenuPresenter Moderator; '' '' hier ist mein Code: '' ' abstrakte Klasse MenuActivity: BaseFragmentActivity() { @Inject interne var Moderator: MenuPresenter? = null '' ' es scheint, dass der Moderator privat ist. Wie kann es nicht privat sein? –

+0

@ 韩建飞 besser den Code für 'MenuActivity' direkt zu Ihrer Frage hinzufügen. – tynn

0

Danke euch allen, Ich habe das gelöst.

machen

@Inject 
internal var presenter: MenuPresenter? = null 

zu

@Inject 
lateinit var presenter: MenuPresenter? = null 
Verwandte Themen