gpt4 book ai didi

java - Dagger /缺失绑定(bind)。如果没有 @Provides 注释的方法,则无法提供输出器

转载 作者:太空宇宙 更新时间:2023-11-04 09:05:50 27 4
gpt4 key购买 nike

我正在通过他们的教程学习 Dagger2,但被阻止在 part 5 。我已经在 Kotlin (jvm) 中实现了所有内容,并且逻辑/行为与到目前为止的工作顺序中的教程相匹配。

但是,我无法创建 SystemOutModule 并且不确定我是否在 Dagger 的某个地方弄错了,或者在我对其模块类的翻译中弄错了。

/**
* Tutorial's Java.
*/
@Module
abstract class SystemOutModule {
@Provides
static Outputter textOutputter() {
return System.out::println;
}
}
/**
* My Kotlin.
*/
@Module
object SystemOutModule {
@JvmSuppressWildcards
@Provides
fun textOutputter(): (String) -> Unit = { println(it) }
}

构建失败并出现以下错误:

~~ ./gradlew clean build


> Task :app:kaptKotlin FAILED
e: /Users/eric/IdeaProjects/atm/app/build/tmp/kapt3/stubs/main/com/es0329/atm/CommandRouterFactory.java:7: error: [Dagger/MissingBinding] com.es0329.atm.Outputter cannot be provided without an @Provides-annotated method.
public abstract interface CommandRouterFactory {
^
com.es0329.atm.Outputter is injected at
com.es0329.atm.HelloWorldCommand(outputter)
com.es0329.atm.HelloWorldCommand is injected at
com.es0329.atm.HelloWorldModule.helloWorldCommand(command)
com.es0329.atm.Command is injected at
com.es0329.atm.CommandRouter(command)
com.es0329.atm.CommandRouter is provided at
com.es0329.atm.CommandRouterFactory.router()

FAILURE: Build failed with an exception.

最佳答案

您的 HelloWorldCommand 需要一个 Outputter,但您提供的是 (String) -> Unit。有几种方法可以弥补这一差距:

选项 1:注入(inject)函数类型

您的 HelloWorldCommand 可以直接请求 (String) -> Unit,而不是 Outputter

class HelloWorldCommand @Inject constructor(private val outputter: (String) -> Unit)

这可行,但您可能希望在应用程序的其他位置提供不同类型的 (String) -> Unit。如果这样做,您将必须使用某种@Qualifier

幸运的是,据我所知,这是整个教程中唯一注入(inject)的 lambda,因此这里不会出现问题。

选项 2:将 Outputter 设置为类型别名

您可以使用类型别名使 Outputter(String) -> Unit 具有相同的类型。这与选项 1 的工作原理相同,但更具表现力。不幸的是,如果您以后想在依赖图中添加另一个 (String) -> Unit ,它也会遇到同样的问题。

typealias Outputter = (String) -> Unit

选项 3:提供 Outputter 接口(interface)的实现

您可以提供一个实现 Outputter 的对象,而不是提供 lambda。对于简单函数来说,这不太惯用,因为 Kotlin 无法将 lambda 直接分配给 Kotlin 中定义的 SAM 接口(interface)。

@Provides
fun textOutputter() = object : Outputter {
override fun output(output: String) = println(output)
}

关于java - Dagger /缺失绑定(bind)。如果没有 @Provides 注释的方法,则无法提供输出器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60245077/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com