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

Koin注入Repository依赖报错,同一Repository在不同Interceptor中注入异常

Koin 依赖解析失败排查步骤
  • 确认模块加载顺序
    首先检查你启动Koin时modules()方法传入的模块顺序,必须保证提供SharedPreferences的androidModule在networkModule之前加载。另外补充SharedPrefDataSource的Koin声明,确认它依赖的SharedPreferences能正常被解析。
  • 排查循环依赖问题
    这是OkHttp拦截器注入最常见的问题:你的OkHttpClient构建时需要注入AuthInterceptor,而AuthInterceptor依赖的TokenApi、UserRepository底层又依赖Retrofit实例,Retrofit的构建反过来需要OkHttpClient,形成循环依赖。
    你可以打开modules.kt定位370、375行的代码,确认是否是OkHttpClient或者API服务的声明位置,即可验证循环依赖是否存在。
  • 检查接口绑定声明
    你贴出的代码中没有UserRepository接口的绑定配置,请确认你的Koin模块中存在如下声明:
    single<UserRepository> { UserRepositoryImpl(get(), get(), get()) }
    
    如果缺少接口绑定,直接调用get<UserRepository>()就会抛出解析失败异常。
  • 解决堆栈行号丢失问题
    日志中Unknown Source:4是混淆导致的行号丢失,属于干扰信息,你可以临时关闭debug包的R8/ProGuard混淆,就能拿到真实的崩溃堆栈行号,准确定位异常位置。
  • 开启Koin调试日志
    初始化Koin时传入日志打印器,就能看到完整的依赖解析链路,直接定位缺失的依赖:
    startKoin {
        logger(PrintLogger(level = Level.DEBUG))
        // 其他配置
    }
    
常见解决方案

如果确认是循环依赖导致的问题,直接给拦截器的依赖加懒加载即可绕开初始化阶段的循环解析:

class AuthInterceptor constructor(
    private val tokenApi: Lazy<TokenApi>,
    private val prefData: Lazy<SharedPrefDataSource>,
    private val userRepository: Lazy<UserRepository>
) : Interceptor, CoroutineScope {
    // 用到依赖的时候直接取.value即可
}

对应Koin声明不需要改,直接传get()就可以自动注入Lazy实例。


内容的提问来源于stack exchange,提问作者This Stack Overflow Life

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 22:15:05