使用Dagger 2提供功能依赖性

Ben*_*min 5 android functional-programming dependency-injection kotlin dagger-2

我想使用Dagger 2提供一个函数作为依赖项:

@Module
class DatabaseModule {

    @Provides
    @Singleton
    fun provideDatabase(application: Application, betaFilter: (BetaFilterable) -> Boolean): Database {
        return Database(application, BuildConfig.VERSION_CODE, betaFilter)
    }

    @Provides
    @Suppress("ConstantConditionIf")
    fun provideBetaFiler(): (BetaFilterable) -> Boolean {
        return if (BuildConfig.FLAVOR_audience == "regular") {
            { it.betaOnly.not() }
        } else {
            { true }
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

不幸的是,它似乎不起作用:

[dagger.android.AndroidInjector.inject(T)] kotlin.jvm.functions.Function1<? 
super com.app.data.BetaFilterable,java.lang.Boolean> 
cannot be provided without an @Provides-annotated method.
Run Code Online (Sandbox Code Playgroud)

我在这里想念什么?

Jul*_* A. 8

是的,可以在Kotlin中完成。

您需要在注入站点添加@JvmSuppressWildcards以确保签名匹配。(来源

我写了以下内容进行验证:

import dagger.Component
import dagger.Module
import dagger.Provides
import javax.inject.Singleton

class G constructor(val function: Function1<Int, Boolean>)

@Singleton
@Module
class ModuleB {
    @Provides
    fun intToBoolean(): (Int) -> Boolean {
        return { it == 2 }
    }
    @JvmSuppressWildcards
    @Provides fun g(intToBoolean: (Int) -> Boolean): G {
        return G(intToBoolean)
    }
}

@Singleton
@Component(modules = [ModuleB::class])
interface ComponentB {
    fun g(): G
}

val componentB = DaggerComponentB.create()
val g = componentB.g()
println(g.function(2)) // true
println(g.function(3)) // false
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,只有在注入位置注释函数类型签名本身的类型时,它才起作用。像这样: `constructor(val function: (@JvmSuppressWildcards Int) -&gt; @JvmSuppressWildcards Boolean)` (6认同)
  • 为什么未选择此答案?这个对我有用。我们不需要Java。 (3认同)