匕首和Kotlin。 匕首不生成组件类

我是新的kotlin和匕首。 我有一个小问题,我不怎么解决,我找不到解决方案。

所以这就是我所拥有的

@Module class AppModule (app: Application) { private var application: Application; init { this.application = app; } @Provides fun provideApplication(): Application? { return application; } @Provides fun provideResources(): Resources? { return application.resources; } 

}

 @Singleton @Component(modules = arrayOf(AppModule::class)) interface AppComponent: AppComponentBase { public class Initializer { private constructor(){} companion object { fun Init(app: Application): AppComponent? { return DaggerAppComponent.builder().appModule(AppModule(app)).build() } } } } 

AppComponentBase :这个接口包含了这个组件所需要的所有方法。

现在,问题是这个DaggerAppComponent类不是由Dagger生成的,如果我在companion object执行了DaggerAppComponent.builder().appModule(AppModule(app)).build()调用。 如果一个调用同一行的任何被companion object匕首生成de类没有任何问题。

另外一件事我找了一个解决方案是创建一个具有相同结构的其他类,并将DaggerAppComponent作为内部对象DaggerAppComponent ,并得到相同的结果。

我不知道外部组件的初始化。 那么,还有其他的解决办法,或者我做错了什么?

您需要在build.gradle中使用kapt处理器 :

 kapt { generateStubs = true } dependencies { ... compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" compile 'com.google.dagger:dagger:2.0.2' kapt 'com.google.dagger:dagger-compiler:2.0.2' ... } 

这个扩展将生成匕首的代码。

您可以查看该项目以供参考

我不知道什么时候发生了这种改变,但是在Kotlin gradle插件的1.1.2版本中,你替换了这个(在你的模块的build.gradle ):

 kapt { generateStubs = true } 

有了这个:

 apply plugin: 'kotlin-kapt' 

然后确保用kapt替换使用annotationProcessor依赖关系。

例如,旧的方法是使用:

 annotationProcessor ( 'some.library:one:1.0' ... 'some.library.n:n.0' ) 

现在你使用:

 kapt ( 'some.library:one:1.0' ... 'some.library.n:n.0' ) 

更新KOTLIN 1.1.4

generateStubs不起作用了。 随意使用最新的Kotlin进行构建,它会告诉你在Android Studio的消息部分,这是没有必要了。 以下是适用于Android和Kotlin的Dagger2的最新依赖列表

 apply plugin: 'kotlin-kapt' //... // Other Gradle stuff //... dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:1.1.4-3" compile 'com.google.dagger:dagger-android:2.12' kapt 'com.google.dagger:dagger-android-processor:2.12' compileOnly 'com.google.dagger:dagger:2.12' kapt 'com.google.dagger:dagger-compiler:2.12' } 

如果你对DaggerComponent有问题,你应该添加

 apply plugin: 'kotlin-kapt' kapt { generateStubs = true } 

build.gradle它将生成dagger 2 kotlin代码,否则项目将只建立在Rebuild

我创建了katas,学习如何用Kotlin重构应用程序https://github.com/xurxodev/Movies-Kotlin-Kata

一个卡塔是关于匕首和它在主分支为我解决https://github.com/xurxodev/Movies-Kotlin-Kata/tree/kata_di_movies

为了更好地理解这个GitHub仓库的目标,我写了一篇中文文章https://proandroiddev.com/learn-kotlin-refactoring-an-app-38cf0cbefe6c

这个问题可以用与原始答案不同的波纹变化来解决

以下也将很好地解决这个问题

与插件

 apply plugin: 'kotlin-android' apply plugin: 'kotlin-kapt' 

和依赖关系

 implementation "com.google.dagger:dagger:$dagger_version" implementation "com.google.dagger:dagger-android:$dagger_version" implementation "com.google.dagger:dagger-android-support:$dagger_version" kapt "com.google.dagger:dagger-compiler:$dagger_version" kapt "com.google.dagger:dagger-android-processor:$dagger_version" 

参考检查这个要点