Dagger 和 Kotlin。 Dagger 不生成组件类

问题描述 投票:0回答:10

我是 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
导入为内部对象,我发生了相同的结果。

我不知道如何在外部进行组件的初始化。那么,还有其他替代解决方案,或者我做错了什么?.

kotlin dagger-2
10个回答
105
投票

您需要在 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'
    ...
}

您可以查看这个项目作为参考


22
投票

我不知道这个更改何时发生,但在 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'
)

14
投票

Kotlin 1.1.4 更新

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

7
投票

这个问题可以通过以下与原始答案不同的更改来解决

以下方法也可以很好地解决这个问题

带有插件

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


1
投票

如果您使用 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"

0
投票

我的情况一定是Dagger实现中的一些排除规则

com.mycompany.native
-> Dagger 不生成代码

com.mycompany.other
-> Dagger 生成代码

我在这上面浪费了相当多的时间:-(我希望它对其他人有帮助!


0
投票

抱歉,我没有创建新问题,而是决定在类似问题下回答,因为也许有人觉得它有用!

我遇到了荒谬的问题! «Make Project» 不生成 dagger 文件。它们是在准备运行您的应用程序时生成的!但我花了几个小时试图解决问题,并没有想到简单地尝试单击“运行”..)))

所以,也许你也面临着同样的问题: “Sync Project with Gradle”、“Clean”和“Build Project”都无法帮助生成 dagger 文件。

-> 然后运行您的应用程序!

在第一个运行应用程序之后,如果我单击“创建项目”,我的 Dagger 将开始生成文件。


0
投票

对于 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文件。

添加所有依赖项后,尝试清理、重建,然后运行项目,您应该会看到生成的文件。


0
投票

如果上述所有解决方案都不起作用,并且您仍然看不到任何生成的 DaggerComponent:

有时这个问题是具有欺骗性的。它来自 Android Studio,会在 build 文件夹中按预期生成

源,但不会刷新此文件夹,您的源会执行 
build
 文件夹中已更改的内容。

您必须手动强制 Android Studio

reload the sources from Disk

 。您可以通过找到适当的操作或右键单击受指控的模块来实现这一点。


-1
投票
如果您有问题

DaggerComponent

,您应该添加

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

build.gradle

它将为
kotlin
生成
dagger 2
代码,否则项目将仅在
Rebuild
上构建
    

© www.soinside.com 2019 - 2024. All rights reserved.