我是 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()
}
}
}
}
AppComponentBase
:该接口包含该组件所需的所有方法。
现在,问题是,如果我在
DaggerAppComponent
中执行此 DaggerAppComponent.builder().appModule(AppModule(app)).build()
调用,则该 companion object
类不是由 Dagger 生成的。
如果通过 companion object
匕首调用同一行,则生成类没有任何问题。
我寻找解决方案的另一件事是创建另一个具有相同结构的不同类,并将
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'
...
}
此扩展将生成 dagger 的代码。
此外,对于较新的 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 的 Messages 部分告诉您不再需要它了。以下是 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'
}
这个问题可以通过以下与原始答案不同的更改来解决
以下方法也可以很好地解决这个问题
带有插件
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"
作为参考,请查看此Gist
如果您使用 kotlin 作为 Android 应用程序开发的主要语言,请使用这些依赖项
// Dagger dependencies
def dagger_version = "2.44"
implementation "com.google.dagger:dagger:$dagger_version"
kapt "com.google.dagger:dagger-compiler:$dagger_version"
implementation "com.google.dagger:dagger-android:$dagger_version"
implementation "com.google.dagger:dagger-android-support:$dagger_version" // if you use the support libraries
kapt "com.google.dagger:dagger-android-processor:$dagger_version"
我的情况一定是Dagger实现中的一些排除规则
com.mycompany.native
-> Dagger 不生成代码
com.mycompany.other
-> Dagger 生成代码
我在这上面浪费了相当多的时间:-(我希望它对其他人有帮助!
抱歉,我没有创建新问题,而是决定在类似问题下回答,因为也许有人觉得它有用!
我遇到了荒谬的问题! «Make Project» 不生成 dagger 文件。它们是在准备运行您的应用程序时生成的!但我花了几个小时试图解决问题,并没有想到简单地尝试单击“运行”..)))
所以,也许你也面临着同样的问题: “Sync Project with Gradle”、“Clean”和“Build Project”都无法帮助生成 dagger 文件。
-> 然后运行您的应用程序!
在第一个运行应用程序之后,如果我单击“创建项目”,我的 Dagger 将开始生成文件。
对于 2023 年仍在寻找答案的人来说, 您只需要以下依赖项:
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
id 'kotlin-kapt'
}
dependencies {
def dagger_version = "2.44" //or any latest versions
implementation 'com.google.dagger:dagger:$dagger_version"'
kapt 'com.google.dagger:dagger-compiler:$dagger_version"'
}
并且您需要在包中查找具有名称的生成组件
“com.yourcompanyname.yourprojectname(调试)”
java包里面。
你不会在java(生成)包中找到生成的dagger文件。
添加所有依赖项后,尝试清理、重建,然后运行项目,您应该会看到生成的文件。
DaggerComponent
,您应该添加
apply plugin: 'kotlin-kapt'
kapt {
generateStubs = true
}
到
build.gradle
它将为
kotlin
生成
dagger 2
代码,否则项目将仅在
Rebuild
上构建