You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 22:31:05