当前位置: 首页 > 知识库问答 >
问题:

kotlin中的Dagger 2静态提供者方法

麻昌翰
2023-03-14

在dagger 2的最新版本中,一个改进是拥有静态提供方法的可能性。简单来说:

@Provides
static A providesA() {
  return A();
}

我想知道如何在kotlin中做到这一点?我试过了。

@Module
class AModule {
  companion object {
    @JvmStatic
    @Provides
    fun providesA(): A = A()
  }
}

但我收到错误消息

@Provides methods can only be present within a @Module or @ProducerModule

我猜伴随对象发生了一些事情,但是我对静态编程语言很陌生,我不确定如何做到这一点。这可能吗?

谢谢!

共有3个答案

羊慈
2023-03-14

现在Dagger2(2.26版)支持@Module中的伴随对象kotlin中带有thourh@Module和@JvmStatic注释的注释类

更好地支持@Module注释类的Kotlin伴随对象中的绑定声明。

将dagger依赖项更新到2.26版本为

def dagger_version = "2.26"
//dagger
implementation "com.google.dagger:dagger:$dagger_version"
kapt "com.google.dagger:dagger-compiler:$dagger_version"

//If you're using classes in dagger.android you'll also want to include:
implementation "com.google.dagger:dagger-android:$dagger_version"
implementation "com.google.dagger:dagger-android-support:$dagger_version"
kapt "com.google.dagger:dagger-android-processor:$dagger_version"

所以现在你可以用

@Module
class AModule {

  companion object {

    @Provides
    fun providesA(): A = A()
  }

}

重要提示:很快,在@Module类中的伴随对象上添加@Module将引发错误。

注意:为了向后兼容,我们仍然允许伴侣对象上的@Module和提供方法上的@JvmStatic。但是,伴侣对象上的@Module现在是禁止操作的,它的所有属性(例如“包含”)都将被忽略。在未来的版本中,我们将在伴侣对象上使用@Module作为错误。

郤立果
2023-03-14

我现在还不能测试,但是我想这个应该可以:

@Module
object AModule {
    @JvmStatic
    @Provides
    fun providesA(): A = A()
}
谢夜洛
2023-03-14

虽然我认为zsmb13的解决方案更好,但我发现了另一个有效的解决方案

@Module
class AModule {
  @Module
  companion object {
    @JvmStatic
    @Provides
    fun providesA(): A = A()
  }

  // add other non-static provides here
}

但是,请注意,对于带有对象的情况,将生成两个类:AModule_ProvidesAFactoryAModule_Companion_Provides AFactoryAModle_ProvideseAFactory类,而不是带有伴生对象的类

 类似资料:
  • 我有一个测试班和测试方法。这取决于数据提供程序方法。数据提供程序方法位于不同的类中,而不是测试类或其基类之一。根据TestNG文件 如果要将数据提供程序放在不同的类中,则它需要是静态方法或具有非参数构造函数的类,并且指定可以在dataProviderClass属性中找到它的类 测试类: 数据提供程序类: Eclipse的测试输出: 它似乎不起作用。我正在使用TestNG 6.9.11并尝试从mav

  • 问题内容: 可以说我有: 我有一个 ApplicationModule ,它需要为 Rec 和 Circle 提供实例: 和 ApplicationComponent : 以这种方式使用代码-无法编译。错误说 错误:(33,20)错误:形状被绑定多次。 对我来说,这是不可行的,因为该组件正试图找到一个实例,并且它找到了两个实例,因此它不知道要返回哪个实例。 我的问题是-我该如何处理? 问题答案:

  • 关于这一高级话题,请先阅读提供者状态一节的介绍。 当按照以下形式来阅读时,提供者状态中的文本应该具有足够的可读性(自动生成的文档是按这样的形式展示的): Given an alligator with the name Mary exists * Upon receiving a request to retrieve an alligator by name ** from Some Consu

  • 契约中的各个交互应该是在互相隔离状态下进行验证的,不得持有前一个交互中的上下文。依赖于之前测试产出结果的测试将会是脆弱的,而且会将你重新陷入到集成测试的泥潭中,而这正是想通过使用契约测试来极力摆脱的困境。 那么怎样测试那些依赖于提供者中已存在的数据的请求呢?提供者状态允许你在交互发生前就可以向数据源注入数据,实现对提供者预置数据,这样就可以生成与消费者期望相匹配的响应了。消费者状态的名字是在消费者

  • 本文向大家介绍Kotlin实现静态方法,包括了Kotlin实现静态方法的使用技巧和注意事项,需要的朋友参考一下 工具类 全都是静态方法的情况 : class 类名 改为 object 类名 即可 普通静态方法 一部分是静态方法的情况 : 将方法用 companion object { } 包裹即可 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 我希望能够将类实例保存到公共静态变量中,但我不知道如何在Kotlin中做到这一点。