【问题标题】:Dagger and Kotlin. Dagger doesn't generate component classes匕首和科特林。 Dagger 不生成组件类
【发布时间】:2016-03-26 08:51:59
【问题描述】:

我是 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:这个接口包含了这个组件需要的所有方法。

现在,问题是如果我在companion object 中执行此DaggerAppComponent.builder().appModule(AppModule(app)).build() 调用,Dagger 不会生成此DaggerAppComponent 类。 如果调用同一行任何由companion object dagger 生成de 类没有任何问题。

我寻找解决方案的另一件事是创建另一个具有相同结构的不同类,并将DaggerAppComponent 作为内部对象导入,我也发生了同样的结果。

我没有在外面初始化组件。那么,还有其他替代解决方案,或者我做错了什么?

【问题讨论】:

  • 你在 build.gradle 中有 kapt 'com.google.dagger:dagger-compiler:2.0.2' 吗?
  • Folwing 也可以很好地使用插件 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" 解决此问题

标签: kotlin dagger-2


【解决方案1】:

你需要在 build.gradle 中有kapt processor

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

您可以查看this project以供参考

【讨论】:

  • 您是从哪里了解到“generateStubs”配置的?我错过了这一点,幸运的是偶然发现了这个答案。
  • dependencies 中的项目序列是否计数?首先它对我不起作用,因为 compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" 已添加到依赖项列表的末尾。然后我将它移到顶部并且它起作用了。
  • Folwing 也可以很好地使用插件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" 解决此问题
  • 如果是基于java的android项目,我们应该在gradle文件中给出什么?
【解决方案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'
)

【讨论】:

  • 感谢您昨天才找到这个 :D 你有这方面的资料吗?你是怎么知道的?
  • 明确一点:apply plugin: 'kotlin-kapt' 应该在您的 module build.gradle
  • 谢谢@charlag。更新了答案。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    以下也可以很好地解决此问题

    带插件

    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

    【讨论】:

    • 你能在 android 库项目中使用它吗?
    • 是的@speedynomads
    • 添加 "kapt "com.google.dagger:dagger-android-processor:2.+" 让匕首对我有用。
    【解决方案5】:

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

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

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

    我在这上面浪费了很多时间 :-( 我希望它可以帮助别人!

    【讨论】:

      【解决方案6】:

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

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

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

      【讨论】:

      • 有效。记得在依赖项中添加kapt 'com.google.dagger:dagger-android-processor:2.14.1'kapt 'com.google.dagger:dagger-compiler:2.14.1'
      • 已弃用。
      猜你喜欢
      • 2018-01-17
      • 2020-10-02
      • 1970-01-01
      • 2020-12-18
      • 2016-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多