2014-12-09 21 views
7

Tôi đang cố gắng sử dụng một Dagger 2 trong dự án Android của tôi, nơi tôi mã trong Kotlin. Tôi lấy một ví dụ từ Dagger 2 repo android-simple. Tôi đã quản lý đúng cách định cấu hình dự án trong Android Studio bằng cách sử dụng ví dụ từ dagger-android-gradle-sample, nó chứa các tệp gradle được định cấu hình đúng cách.Tài liệu tham khảo chưa được giải quyết cho Dagger 2 trong Kotlin

Bây giờ tôi bắt đầu thay đổi các lớp học java thành kotlin. Đây là cách tự động chuyển đổi DemoApplication.java trông giống như trong Kotlin:

public class DemoApplication : Application() { 

    Singleton 
    Component(modules = array(javaClass<AndroidModule>())) 
    trait ApplicationComponent { 
     public fun inject(application: DemoApplication) 
     public fun inject(homeActivity: HomeActivity) 
     public fun inject(demoActivity: DemoActivity) 
    } 

    public var component: ApplicationComponent? = null 

    override fun onCreate() { 
     super.onCreate() 
     component = `Dagger_DemoApplication$ApplicationComponent`.builder().androidModule(AndroidModule(this)).build() 
     component!!.inject(this) 
    } 
} 

lớp Dagger tạo có thể nhìn thấy trong Kotlin nhưng nó than phiền về ($) dấu hiệu sử dụng trong tên lớp. ($) ở Kotlin có mục đích đặc biệt nên tôi đoán đó là lý do tại sao. Bạn có thể lưu ý rằng tự động hội tụ bọc tên lớp bằng dấu (`) để trình soạn thảo không phàn nàn về nó. Thật không may, trình biên dịch là không có:

Error:(32, 21) Unresolved reference: `Dagger_DemoApplication$ApplicationComponent` 

:app:compileDebugKotlin FAILED 

Ngoài ra còn có một ngoại lệ nếu tôi cố gắng xây dựng nó từ Terminal:

org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:compileDebugKotlin'. 
     at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:69) 
     at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46) 
     at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35) 
     at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:64) 
     at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58) 
     at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:42) 
     at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52) 
     at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:53) 
     at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43) 
     at org.gradle.api.internal.AbstractTask.executeWithoutThrowingTaskFailure(AbstractTask.java:305) 
     at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.executeTask(AbstractTaskPlanExecutor.java:79) 
     at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:63) 
     at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:51) 
     at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:23) 
     at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:88) 
     at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:29) 
     at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:62) 
     at org.gradle.execution.DefaultBuildExecuter.access$200(DefaultBuildExecuter.java:23) 
     at org.gradle.execution.DefaultBuildExecuter$2.proceed(DefaultBuildExecuter.java:68) 
     at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32) 
     at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:62) 
     at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:55) 
     at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:149) 
     at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:106) 
     at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:86) 
     at org.gradle.launcher.exec.InProcessBuildActionExecuter$DefaultBuildController.run(InProcessBuildActionExecuter.java:80) 
     at org.gradle.launcher.cli.ExecuteBuildAction.run(ExecuteBuildAction.java:33) 
     at org.gradle.launcher.cli.ExecuteBuildAction.run(ExecuteBuildAction.java:24) 
     at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:36) 
     at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:26) 
     at org.gradle.launcher.cli.RunBuildAction.run(RunBuildAction.java:51) 
     at org.gradle.internal.Actions$RunnableActionAdapter.execute(Actions.java:171) 
     at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:237) 
     at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:210) 
     at org.gradle.launcher.cli.JavaRuntimeValidationAction.execute(JavaRuntimeValidationAction.java:35) 
     at org.gradle.launcher.cli.JavaRuntimeValidationAction.execute(JavaRuntimeValidationAction.java:24) 
     at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:206) 
     at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:169) 
     at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:33) 
     at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:22) 
     at org.gradle.launcher.Main.doAction(Main.java:33) 
     at org.gradle.launcher.bootstrap.EntryPoint.run(EntryPoint.java:45) 
     at org.gradle.launcher.bootstrap.ProcessBootstrap.runNoExit(ProcessBootstrap.java:54) 
     at org.gradle.launcher.bootstrap.ProcessBootstrap.run(ProcessBootstrap.java:35) 
     at org.gradle.launcher.GradleMain.main(GradleMain.java:23) 
     at org.gradle.wrapper.BootstrapMainStarter.start(BootstrapMainStarter.java:33) 
     at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:130) 
     at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:48) 
Caused by: org.gradle.api.GradleException: Compilation error. See log for more details 
     at org.jetbrains.kotlin.gradle.tasks.KotlinCompile.compile(Tasks.kt:130) 
     at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:63) 
     at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.doExecute(AnnotationProcessingTaskFactory.java:218) 
     at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:211) 
     at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:200) 
     at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:579) 
     at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:562) 
     at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80) 
     at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61) 
     ... 47 more 

Có ai biết làm thế nào để giải quyết vấn đề này? Nếu không, tôi sẽ phải giữ các lớp bằng cách sử dụng Dagger_ * trong java.

+0

Tôi đã gửi một vấn đề trong trình theo dõi lỗi của Kotlin: https://youtrack.jetbrains.com/issue/KT-6444, vui lòng đăng ký nhận các cập nhật –

Trả lời

9

Bạn có thể giải quyết nó bằng cách đợi! Xem https://github.com/google/dagger/issues/58.

Biểu tượng $ đang được xóa khỏi tất cả các mã được tạo trước phiên bản đầu tiên (và hy vọng sớm hơn là sau này).

Ngoài ra, tôi sẽ gửi lỗi với Jetbrains về hành vi vì $ là một ký tự hoàn toàn hợp lệ để xuất hiện trong tên lớp.

+0

Từ bản trình bày mới nhất Tôi nghe nói rằng Kotlin không hoạt động với chú thích đúng cách . Vì vậy, vấn đề chỉ là trong việc tạo mã tên hoặc bằng cách xử lý chú thích Kotlin? –

+0

Xử lý chú thích hoạt động tốt. –

+0

@EugenMartynov Tuy nhiên, cho đến khi $ bị loại bỏ, hãy giữ các giao diện '@ Component' và' @ Module' trong java. –

Các vấn đề liên quan