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)
我在这里想念什么?
是的,可以在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)
| 归档时间: |
|
| 查看次数: |
800 次 |
| 最近记录: |