Dagger Hilt中@Binds方法参数与返回类型不兼容问题求助
问题分析
错误的核心原因是**@Binds方法的参数类型与返回类型不兼容**:你的bindTimeSource方法返回类型被解析为Kotlin标准库的kotlin.time.TimeSource,但参数TimeSourceAdapter并未实现这个标准库接口;同时你自定义了一个同名的TimeSource接口,和标准库类名冲突导致导入混淆。
解决方案
1. 修正类型匹配关系
根据你的代码逻辑,你需要绑定的是自定义的TimeSource接口,而非Kotlin标准库的TimeSource,请按以下两种场景调整:
场景1:直接绑定DefaultTimeSource到自定义TimeSource
如果不需要TimeSourceAdapter的包装逻辑,直接绑定实现类到自定义接口:
// 确保导入的是你自己定义的TimeSource,而非kotlin.time.TimeSource import com.viswa.befocused.feature.timer.DefaultTimeSource import com.viswa.befocused.feature.timer.TimeSource @Module @InstallIn(SingletonComponent::class) abstract class AppModule { // ... 其他代码不变 ... @Binds abstract fun bindTimeSource(defaultTimeSource: DefaultTimeSource): TimeSource }
场景2:通过TimeSourceAdapter绑定自定义TimeSource
如果必须保留TimeSourceAdapter,先让它实现你的自定义TimeSource接口:
// 修改TimeSourceAdapter类 class TimeSourceAdapter @Inject constructor(private val defaultTimeSource: DefaultTimeSource) : TimeSource { override val elapsedRealTime: Long get() = defaultTimeSource.elapsedRealTime }
然后修正@Binds方法:
@Binds abstract fun bindTimeSource(timeSourceAdapter: TimeSourceAdapter): TimeSource
2. 解决命名冲突(可选但推荐)
你自定义的TimeSource接口与Kotlin标准库类名重名,容易导致导入错误。建议:
- 给自定义接口重命名(比如
AppTimeSource); - 或者在代码中明确指定包名(如
com.viswa.befocused.feature.timer.TimeSource),避免导入混淆。
3. 处理Room Schema警告(额外优化)
Room的警告提示缺少schema导出目录,可在app模块的build.gradle中添加配置:
android { defaultConfig { javaCompileOptions { annotationProcessorOptions { arguments += mapOf("room.schemaLocation" to "$projectDir/schemas") } } } }
或者将FocusedDatabase中的exportSchema设为false(不推荐,schema用于数据库版本迁移)。
内容的提问来源于stack exchange,提问作者Hey_Viswa
相关产品推荐
相关产品推荐

