代码之家  ›  专栏  ›  技术社区  ›  Fred

kotlin中的Dagger 2静态提供程序方法

  •  68
  • Fred  · 技术社区  · 9 年前

    在dagger 2的最新版本中,所做的改进之一是可以使用静态提供方法。简单地说:

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

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

    但我收到了错误信息:

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

    我猜想伴星物体在这里发生了一些事情,但是我对科特林很陌生,我不确定如何做到这一点。有可能吗?

    5 回复  |  直到 9 年前
        1
  •  61
  •   arekolek    8 年前

    尽管我认为 zsmb13

    @Module
    class AModule {
      @Module
      companion object {
        @JvmStatic
        @Provides
        fun providesA(): A = A()
      }
    
      // add other non-static provides here
    }
    

    AModule_ProvidesAFactory 和 AModule_Companion_ProvidesAFactory AModule_提供工厂

        2
  •  50
  •   zsmb13    9 年前

    我现在无法测试,但我认为这应该可行:

    @Module
    object AModule {
        @JvmStatic
        @Provides
        fun providesA(): A = A()
    }
    
        3
  •  19
  •   Pavneet_Singh    6 年前

    现在 Dagger2 (version 2.26) support companion objects in @Module annotated classes in kotlin withthouh @Module and @JvmStatic annotations

    更好地支持Kotlin companion中的绑定声明

    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()
      }
    
    }
    

    重要的 @模块 在…上 在里面 课程将 .

    上的伴生对象和@JvmStatic提供了方法。然而 @伴随对象上的模块现在是无操作的,其所有 属性(例如“includes”)将被忽略。 In future releases, we will make it an error to use @Module on a companion object.

        4
  •  18
  •   sophia    8 年前

    https://github.com/google/dagger/issues/900

    静态提供可以通过@JvmStatic实现。我看到出现了两种情况:

    顶级 object s

    @Module object DataModule {   
      @JvmStatic @Provides fun 
        provideDiskCache() = DiskCache() 
    } 
    

    模块,事情变得有点奇怪

    @Module abstract class DataModule {   
        @Binds abstract fun provideCache(diskCache: DiskCache): Cache
    
        @Module   
        companion object {
            @JvmStatic @Provides fun provideDiskCache() = DiskCache()   
        } 
    } 
    

    伴生物体也必须标注为@Module under the hood, kotlin编译器将这些静态方法复制到 常规静态字段。匕首也会在同伴中看到他们 对象,但该“模块”将从dagger获得代码gen,但会被标记 “未使用”。IDE会将其标记为provideDiskCache

        5
  •  5
  •   Peter F    6 年前

    对于纯静态方法,我喜欢 zsmb13

    @Provides 和 @Binds 在一个模块内。 这不可能直接实现,但需要两个嵌套模块(如 Omar Al Halabi

    我采取了一种稍微不同的方法来组合 @提供 :

    @Module(includes = [MyModule.Bindings::class])
    object MyModule {
        @Module
        interface Bindings {
            @Binds
            fun bindA(a: AImpl): A
        }
    
        @Provides
        @JvmStatic
        fun provideB(): B = BImpl()
    }
    

    区别在于:

    • 外部模块是提供静态功能的对象。该备件使用非故意的 companion object
    • 内部模块保存抽象绑定。我可以在这里使用一个接口,该接口使 abstract
    • 外部模块包括内部模块,因此我不必在其他地方包括内部模块。
    推荐文章