我是kotlin和Dagger的新人.我有一个小问题,我不知道如何解决,我找不到解决方案.
所以这就是我的意思
@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() } } } }
}
@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中执行此DaggerAppComponent.builder().appModule(AppModule(app)).build()
调用,则此类不是由Dagger生成的companion object
.如果一个调用同一行任何由companion object
匕首生成de class没有任何问题.
我确实寻找解决方案的另一件事是创建一个具有相同结构的另一个不同的类,并导入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' ... }
此扩展将生成匕首的代码.
此外,对于较新的gradle版本,您还可以在build.gradle中应用该插件:
apply plugin: 'kotlin-kapt' 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'
然后请务必立即更换使用的依赖annotationProcessor
与kapt
.
例如,旧的方法是使用:
annotationProcessor ( 'some.library:one:1.0' ... 'some.library.n:n.0' )
现在你使用:
kapt ( 'some.library:one:1.0' ... 'some.library.n:n.0' )
generateStubs
不再起作用了.随意使用最新的Kotlin进行构建,它会在Android Studio 的" 消息"部分告诉您不再需要它.这是Dagger2 for Android和Kotlin 的最新依赖列表
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' }